• 完美十进制数——去年天梯校赛


    7-4 完美十进制数
    对于一个十进制正整数 x,其包含 k 个位,每个数位的数字累加和为 sum 。如果 sum%k=0,那么这个十
    进制数就是完美的
    例:对于数 12340,包含 5 位,数位累加和为 10,10%5=0,所以 12340 是完美十进制数。
    给定一个十进制正整数 N,可以任意删除 N 的一些十进制位,求得到最大的完美十进制数是多少。
    删除后剩余的数可以包含前导零,并且每个前导零都算作一位,例如:1063,删除最高位 1 后变成
    063,包含 3 位,累加和为 9,是完美十进制数。如果删除 10 后变成 63,包含 2 位,累加和为 9,此时
    就不是完美十进制数。
    需要注意的是,前导零虽然占位,但不会改变十进制数值的大小,例如 063=63≤73。
    如果最终答案的完美十进制数包含了前导零,前导零不用输出。
    输入格式:
    输入包含一行,表示十进制整数 N (1≤N≤1020),保证 N 不含前导零。
    输出格式:
    输出包含一行,表示得到的最大完美十进制数。不需要输出前导零。
    3
    输入样例1:6096
    输出样例1:696
    输入样例2:1063
    输出样例2:63
    样例解释:
    063 是完美十进制数,前导零无需输出。

    想法:

    直接用dfs搜,用vis数组的0和1表示这一位的数字是否删除。然后存到数组v中,求最大值

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. string a;
    4. int len;
    5. int vis[10]={0};
    6. vector<int> v;
    7. void dfs(int x){//位数
    8. if(x==len){
    9. int sign=0,num=0,sum=0;
    10. for(int i=0;i<len;i++) {
    11. if(vis[i]) {
    12. sum+=a[i]-'0';
    13. num++;
    14. sign=1;
    15. }
    16. }
    17. if(sign==0) return ;//数字全都不选
    18. if(sum%num==0){
    19. int n=0;
    20. for(int i=0;i<len;i++) {
    21. if(vis[i])
    22. n=n*10+a[i]-'0';
    23. }
    24. v.push_back(n);
    25. }
    26. return ;
    27. }
    28. for(int i=1;i>=0;i--){//0是不选,1是选
    29. vis[x]=i;//
    30. dfs(x+1);
    31. }
    32. }
    33. int main(){
    34. cin>>a;
    35. len=a.size();
    36. dfs(0);
    37. int ans=-1;
    38. for(int i=0;i<v.size();i++){
    39. ans=max(ans,v[i]);
    40. }
    41. cout<<ans;
    42. return 0;
    43. }

    结果没想到时间复杂度,数据范围是1<=n<=10e20,long long都爆了,这样的话就不能这么去最大值了(我还以为是1020hhh)。题解那说的是“字符串模拟十进制数比较大小”,本来我就弄个sort必字符串的,结果我发现这样的话就是“9”>“696”了。所以要先看一下字符串长度。

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. string a;
    4. int len;
    5. int vis[10]={0};
    6. vector<string> v;//不用开个vector的v[],人家本来都是数组
    7. bool cmp(string a,string b){
    8. if(a.size()==b.size()) return a>b;
    9. return a.size()>b.size();
    10. }
    11. void dfs(int x){
    12. if(x==len){
    13. int sign=0,num=0,sum=0;
    14. for(int i=0;i<len;i++) {
    15. if(vis[i]) {
    16. sum+=a[i]-'0';
    17. num++;
    18. sign=1;
    19. }
    20. }
    21. if(sign==0) return ;
    22. if(sum%num==0){
    23. string n;
    24. for(int i=0;i<len;i++) {
    25. if(vis[i])
    26. {
    27. n+=a[i];
    28. }
    29. }
    30. v.push_back(n);
    31. }
    32. return ;
    33. }
    34. for(int i=1;i>=0;i--){//0是不选,1是选
    35. vis[x]=i;//
    36. dfs(x+1);
    37. }
    38. }
    39. int main(){
    40. cin>>a;
    41. len=a.size();
    42. dfs(0);
    43. sort(v.begin(),v.end(),cmp);
    44. int flag=0;
    45. for(int i=0;i<v[0].size();i++){
    46. if(v[0][i]!='0'&&flag==0){
    47. cout<<v[0][i];
    48. flag==1;
    49. }
    50. else if(flag) cout<<v[0][i];
    51. }
    52. return 0;
    53. }

  • 相关阅读:
    MES管理系统与ERP系统的实施顺序与决策
    css主题切换
    第六章:Java内存模型之JMM
    Quarkus 集成 mailer 使用 easyexcel 发送表格邮件
    K210 调节颜色阈值识别红绿黄三色
    分布式消息队列RocketMQ继承SpringBoot
    # Spring 事务失效场景
    Mysql创建数据库索引
    实战纪实 | 某米企业src未授权访问
    Mybatis批量插入数据的两种方式
  • 原文地址:https://blog.csdn.net/2301_80718054/article/details/136634212