数位排序(2023寒假每日一题 9)
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如, 2022 2022 2022 排在 409 409 409 前面,因为 2022 2022 2022 的数位之和是 6 6 6,小于 409 409 409 的数位之和 13 13 13。
又如, 6 6 6 排在 2022 2022 2022 前面,因为它们的数位之和相同,而 6 6 6 小于 2022 2022 2022。
给定正整数 n , m n,m n,m,请问对 1 1 1 到 n n n 采用这种方法排序时,排在第 m m m 个的元素是多少?
输入格式
输入第一行包含一个正整数
n
n
n。
第二行包含一个正整数 m m m。
输出格式
输出一行包含一个整数,表示答案。
数据范围
对于
30
%
30\%
30% 的评测用例,
1
≤
m
≤
n
≤
300
1≤m≤n≤300
1≤m≤n≤300。
对于
50
%
50\%
50% 的评测用例,
1
≤
m
≤
n
≤
1000
1≤m≤n≤1000
1≤m≤n≤1000。
对于所有评测用例,
1
≤
m
≤
n
≤
1
0
6
1≤m≤n≤10^6
1≤m≤n≤106。
输入样例:
13
5
输出样例:
3
样例解释
1
1
1 到
13
13
13 的排序为:
1
,
10
,
2
,
11
,
3
,
12
,
4
,
13
,
5
,
6
,
7
,
8
,
9
1,10,2,11,3,12,4,13,5,6,7,8,9
1,10,2,11,3,12,4,13,5,6,7,8,9。
第 5 5 5 个数为 3 3 3。
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
const int N = 1000010;
typedef pair<int, int> PII;
int n, m;
PII a[N];
int main(){
cin >> n >> m;
int b, c;
for(int i = 1; i <= n; i++) {
b = i, c = 0;
while(b) c += b % 10, b /= 10;
a[i].x = c, a[i].y = i;
}
sort(a, a + n + 1);
cout << a[m].y << endl;
return 0;
}