LG0079 数位排序进制+排序

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LG0079 数位排序进制+排序相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2022初赛 C++ C组E题

题目描述
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为2022 的数位之和是6,小于 409 的数位之和13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?

输入格式
输入第一行包含一个正整数n。
第二行包含一个正整数m。
30% 的评测用例,1 ≤ m ≤ n ≤ 300。
50% 的评测用例,1 ≤ m ≤ n ≤ 1000。
100%的评测用例,1 ≤ m ≤ n ≤ 10^6。

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

输入样例
13
5

输出样例
3

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

问题分析
根据进制原理,可以算出各个数的数位之和。
排序一下就可以了。
可以使用结构体来存储数据,也可以用pair来存储数据,后者更为方便一些。

AC的C++语言程序如下:

/* LG0079 数位排序 */

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1000000 + 1;
pair<int, int> a[N];

int getsum(int n)

    int sum = 0;
    while (n)
        sum += n % 10, n /= 10;
    return sum;


int main()

    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= n; i++) 
        a[i].first = getsum(i);
        a[i].second = i;
    

    sort(a + 1, a + 1 + n);

    cout << a[m].second << endl;

    return 0;

以上是关于LG0079 数位排序进制+排序的主要内容,如果未能解决你的问题,请参考以下文章

CCF201512-1 数位之和(100分)进制+文本

数位之和计算

201512-1 数位之和

CCF系列之数位之和(201512-1)

CSP201512-1: 数位之和

基础排序算法之基数排序