小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,
2022
2022
2022 排在
409
409
409 前面,因为
2022
2022
2022 的数位之和是
6
6
6,小于
409
409
409的数位之和
13
13
13。
又如,
6
6
6 排在
2022
2022
2022前面,因为它们的数位之和相同,而
6
6
6 小于
2022
2022
2022。
给定正整数
n
,
m
n,m
n,m,请问对
1
1
1到
n
n
n采用这种方法排序时,排在第
m
m
m个的元素是多少?
输入格式
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
输出格式
输出一行包含一个整数,表示答案。
数据范围
对于
30
30%
30的评测用例,
1
≤
m
≤
n
≤
300
1≤m≤n≤300
1≤m≤n≤300。
对于
50
50%
50的评测用例,
1
≤
m
≤
n
≤
1000
1≤m≤n≤1000
1≤m≤n≤1000。
对于所有评测用例,
1
≤
m
≤
n
≤
106
1≤m≤n≤106
1≤m≤n≤106。
输入样例:
13
5
输出样例:
3
样例解释
1
到
13
1到 13
1到13的排序为:
1
,
10
,
2
,
11
,
3
,
12
,
4
,
13
,
5
,
6
,
7
,
8
,
9
1,10,2,11,3,12,4,13,5,6,7,8,9
1,10,2,11,3,12,4,13,5,6,7,8,9。
第
5
个数为
3
。
第 5个数为 3。
第5个数为3。
import sys
input = lambda: sys.stdin.readline().strip()
n=int(input())
m=int(input())
a=[(0,0)]
for i in range(1,n+1):
a.append((sum(int(digit) for digit in str(i)),i))
a.sort()
print(a[m][1])
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6+10;
PII f[N];
int fun(int x)
{
int res=0;
while(x){
res+=x%10;
x/=10;
}
return res;
}
int main()
{
int m,n;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
f[i]={fun(i),i};
}
sort(f+1,f+1+n);
cout<<f[m].second<<endl;
return 0;
}
吐槽
python打这种算法竞赛感觉有点吃亏啊,今天写这题先是没加
import sys
input = lambda: sys.stdin.readline().strip()
然后直接给我卡了四个数据,加了这个之后,还是卡了一个数据,找了好久还是没找到加速的代码,然后抱着试一试的心态又交了一发,然后就AC了。。。。。
思路:
本题的思路不是很难,我们只需要进行对应的模拟就行。首先看一下数据大小为
1
0
6
10^6
106,那么我们的时间复杂度得控制在
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),那么现在知道了目标,我们就开始进行模拟。
首先我们读题发现题目是根据数字的各个位数之和来进行排序的,那么我们就想到了用一个二维数组来保存数据,也就是[数字各个位数之和,数字],然后根据前者进行排序就行了。
那么这个数字各个位数之和怎么求呢,是我我直接写个函数
def fun(x):
res=0
while x!=0 :
res+=x%10
x//=10
return res
但是作为优雅的python选手,我们能压缩就压缩,反正代码同样的功效就行了。所以直接选择 s u m sum sum函数,也就是
sum(int(digit) for digit in str(i)
上面的代码就是将i转化为字符串,然后用一个digit遍历这个字符串再将digit强转成int类型,最后用一个sum求和就完了。
优雅,太优雅了.