题目描述
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,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。
对于所有评测用例,1≤m≤n≤106。
样例
输入样例:
13
5
输出样例:
3
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],cnt[N];
struct ST{
int w,p;//w是数值,p是数位
bool operator<(const ST &W){
if(p!=W.p)return p<W.p;
else return w<W.w; //如果数位相同,则按数值排序
}
}p[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)p[i].w=i;//将数值赋给w
for(int i=1;i<=n;i++){
int tmp=p[i].w,res=0,ans;
while(tmp){//处理数位
ans=tmp%10;
res+=ans;
tmp/=10;
}
//cout<<res<<endl;
p[i].p=res;
}
sort(p+1,p+1+n);
//for(int i=1;i<=n;i++)cout<<p[i].w<<endl;
cout<<p[m].w;
return 0;
}
blablabla
```