A40892. 数位排序本题总分:15 分【问题描述】小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。给定正整数 n,m,请问对…
填空题
较难
知识点
题目描述
数位排序
本题总分:15 分
【问题描述】
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当
两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,
将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位
之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元
素是多少?
【输入格式】
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
13
5
【样例输出】
3
参考答案
#include <bits/stdc++.h>
using namespace std;
struct ST{
int value;
short shuwei;
}arr[1000010];
bool cmp(struct ST a,struct ST b)
{
if(a.shuwei==-1)
{
a.shuwei=0;
a.shuwei += a.value/1000000;
a.shuwei += a.value%1000000/100000;
a.shuwei += a.value%100000 /10000;
a.shuwei += a.value%10000 /1000;
a.shuwei += a.value%1000 /100;
a.shuwei += a.value%100 /10;
a.shuwei += a.value%10;
arr[a.value].shuwei = a.shuwei;
}
if(b.shuwei==-1)
{
b.shuwei=0;
b.shuwei += b.value/1000000;
b.shuwei += b.value%1000000/100000;
b.shuwei += b.value%100000 /10000;
b.shuwei += b.value%10000 /1000;
b.shuwei += b.value%1000 /100;
b.shuwei += b.value%100 /10;
b.shuwei += b.value%10;
arr[b.value].shuwei = b.shuwei;
}
if(a.shuwei != b.shuwei)
return a.shuwei<b.shuwei;
else
return a.value<b.value;
}
int main()
{
int i,j,n,m;
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
{
arr[i].shuwei=-1;
arr[i].value = i;
}
sort(arr+1,arr+n+1,cmp);
//for(i=1;i<=n;i++)
// printf("shuwei:%hd value:%d\n",arr[i].shuwei,arr[i].value);
printf("%d",arr[m].value);
return 0;
}
上一题
下一题