C++
\color{gold}{— > 蓝桥杯辅导课题解}
思路:
通过数组 a 存储一下1到n这n个数,然后 sort 一下数组a,然后直接输出a[m]即可
(sort函数要加入自定义比较函数cmp)
code:
//蓝桥杯13届(2022)C组
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N], b[N]; // a数组存储原数据,b数组存储数位和
bool cmp (int x, int y){ // 比较函数
//if (b[x] != b[y]) // 两个数各个数位之和不同时,将数位和较小的排在前面
//return b[x] < b[y];
//else // 当数位之和相等时,将数值小的排在前面
//return x < y;
return b[x] < b[y] || b[x] == b[y] && x < y;
}
int main(){
cin >> n >> m;
for (int i = 1; i <= n; i ++){
int num = i;
while (num){ // 求数位和
b[i] += num % 10;
num /= 10;
}
a[i] = i;
}
sort (a + 1, a + n + 1, cmp);
cout << a[m] << endl;
return 0;
}
简洁版:
code:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N], b[N];
bool cmp(int x, int y) {
return b[x] < b[y] || b[x] == b[y] && x < y;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
int num = i; a[i] = i;
while (num) {
b[i] += num % 10;
num /= 10;
}
}
sort(a + 1, a + n + 1, cmp);
cout << a[m];
return 0;
}
我新手问一下哈,我看好像bool只能返回ture和false,这个bool返回的好像不是啊
是返回的 true 或者 false 的啊,比如那个 return b[x] < b[y],当 b[x] 是小于 b[y] 的时候,会返回 true, 当 b[x] 大于 b[y] 的时候,会返回 false 的。
嗷嗷好的谢谢了
6
为什么cmp函数里下x<y写成a[x]<a[y]是错的?
cmp函数里的x,y是形式参数,形式参数会接受实际参数传过来的值,这里 sort函数调用cmp, 实际参数是数组a的值,那么形式参数x,y就已经是数组a的值,所以怎么在把 x<y写成a[x]<a[y],不可以自己调用自己哦
厉害,哥