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 数位排序进制+排序的主要内容,如果未能解决你的问题,请参考以下文章