一、题目描述
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
输入格式:
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
输出格式:
输出一行包含一个整数,表示答案。
输入样例:
13
5
输出样例:
3
样例解释:
1 到 13 的排序为:1,10,2,11,3,12,4,13,5,6,7,8,9。
第 5 个数为 3。
二、解题思路
因为每一个数有数位和与它自己的值两种属性。所以用结构体就非常方便。使用x存储它自身的值,使用y存储它的数位和。再编写一个cmp函数,最后排序即可。
二、AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct node{
int x,y;
}a[N];
bool cmp(node a,node b)
{
if(a.y!=b.y)return a.y<b.y;
return a.x<b.x;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].x=i;
int t=i;
while(t){
a[i].y+=t%10;
t/=10;
}
}
sort(a+1,a+1+n,cmp);
cout<<a[m].x;
}
四、知识点总结
1、sort()的应用。它的前两个参数要是地址才行,我用a[1]、a[m]报错了。具体看下面这个链接,讲得是非常详细了。