• 数位排序(蓝桥杯)


    数位排序

    问题描述

    小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。

    例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。

    又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。

    给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
    输入格式
    输入第一行包含一个正整数 n 。

    第二行包含一个正整数 m 。

    输出格式

    输出一行包含一个整数, 表示答案。

    样例输入

    13
    5
    
    • 1
    • 2

    样例输出

    3
    
    • 1

    样例说明

    1 到 13 的排序为:
    1,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。

    评测用例规模与约定

    对于30%的评测用例, 1≤m≤n≤300 。
    对于50%的评测用例, 1≤m≤n≤1000 。
    对于所有评测用例, 1≤m≤n≤106

    c++(sort排序函数)

    #include
    using namespace std;
    #include
    const long int z=1e6+1;
    
    long int a[z],b[z];//定义在全局变量,使得数组初始化为0,且第一个元素为0,不会影响数组顺序,能直接输出a[0] 
    
    //数位求和 
    int get_sum(int a)
    {
      int sum=0;
      while(a!=0)
      {
        sum+=a%10;
        a/=10;
      }
      return sum;
    }
    
    bool cmp(int x,int y)
    {
      return b[x]<b[y]||(b[x]==b[y]&&x<y);
      //对两个数进行比较
      //先满足条件一:将数位和较小的排在前面
      //再满足条件二:当数位之和相当时,将数值小的排在前面 
    }
    
    int main()
    {
      long int n,m,i;
      cin>>n>>m;
      for(i=1;i<=n;i++)
      {
        a[i]=i;
        b[i]=get_sum(i);
      }
      sort(a+1,a+n+1,cmp);//在这里不需要对cmp函数传入参数,这是规则 
      cout<<a[m]<<endl;//a[0]=0不影响结果,所以直接输出a[m] 
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    C语言

    因为数据范围过大,运行超时

    #include
    
    int get_sum(int n)
    {
      int sum=0;
      while(n!=0)
      {
        sum+=n%10;
        n/=10;
      }
      return sum;
    }
    
    int main()
    {
      long int n,m,i,j;
      scanf("%ld %ld",&n,&m);
      long int a[n],b[n];
      for(i=0;i<n;i++)
      {
        a[i]=i+1;//从零开始,所以要+1 
        b[i]=get_sum(i+1);
    //    printf("%d ",b[i]);
      }
    //  printf("\n");
      for(i=0;i<n-1;i++)//循环遍历每一种可能 
      {
        for(j=0;j<n-1-i;j++)
        {
          if(b[j]>b[j+1])//条件1,在交换a数组的同时,也交换b数组 
          {
            int tmp=a[j];
            a[j]=a[j+1];
            a[j+1]=tmp;
            int t=b[j];
            b[j]=b[j+1];
            b[j+1]=t;
          }
          else if(b[j]==b[j+1])//条件二 
          {
            if(a[j]>a[j+1])
            {
              int tmp=a[j];
              a[j]=a[j+1];
              a[j+1]=tmp;
            }
          }
        }
      }
      for(i=0;i<n;i++)
      {
      	printf("%d ",a[i]);
      }
      printf("%d",a[m-1]);
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    推出链上美债产品的 ProsperEx:RWA 衍生品赛道的早期玩家
    海南省建设自由贸易岛对海南旅游发展影响的思考
    Vuex详解,一文彻底搞懂Vuex
    c语言的数据结构:找环状链表入口处
    MKL稀疏矩阵运算示例及函数封装
    c++图论
    一款客服系统有哪些必备的功能模块?
    分布事务和分布式锁
    HANA 常用数据类型详解
    防蓝光护眼灯哪个牌子比较好?目前比较好用的护眼灯推荐
  • 原文地址:https://blog.csdn.net/m0_73841621/article/details/133278714