小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,202220222022 排在 409409409 前面,因为 202220222022 的数位之和是 666,小于 409409409 的数位之和 131313。
又如,666 排在 202220222022 前面,因为它们的数位之和相同,而 666 小于 202220222022。
给定正整数 n,mn,mn,m,请问对 111 到 nnn 采用这种方法排序时,排在第 mmm 个的元素是多少?
输入格式
输入第一行包含一个正整数 nnn。
第二行包含一个正整数 mmm。
输出格式
输出一行包含一个整数,表示答案。
数据范围
对于 30%30\%30% 的评测用例,1≤m≤n≤3001≤m≤n≤3001≤m≤n≤300。
对于 50%50\%50% 的评测用例,1≤m≤n≤10001≤m≤n≤10001≤m≤n≤1000。
对于所有评测用例,1≤m≤n≤1061≤m≤n≤10^61≤m≤n≤106。
输入样例:
13
5
输出样例:
3
样例解释
111 到 131313 的排序为:1,10,2,11,3,12,4,13,5,6,7,8,91,10,2,11,3,12,4,13,5,6,7,8,91,10,2,11,3,12,4,13,5,6,7,8,9。
第 555 个数为 333。
#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;
}