补题了,233
题目
题目描述
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022的数位之和是 6,小于 409 的数位之和 13。
又如,66 排在 2022 前面,因为它们的数位之和相同,而 6小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
输入格式
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
输出格式
输出一行包含一个整数,表示答案。
数据范围
对于 30%的评测用例,1≤m≤n≤300
对于 50% 的评测用例,1≤m≤n≤1000
对于所有评测用例,1≤m≤n≤10^6
样例
题解
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int n = 1000010;
int a[n], b[n] = { 0 };
bool compare(int d, int f) {
if (b[d] == b[f])return d < f;
else return b[d] < b[f];
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
a[i] = i;
for (auto c : to_string(a[i]))b[i] += c - '0';//单独求比在compare更省时间
}
sort(&a[1], a + n + 1, compare);
cout << a[m];
}
注意事项
能先求出的就别在sort函数中求
sort的用法和自定义函数的写法