计蒜客 - 课外活动
2022-02-09 本文已影响0人
戴文KeepLearning
QQ图片20220210112022.png
题目解析
此题对于刚入门信竞的学生来说会存在一定的难度,因为它将函数、排序、动态数组这几个重要概念进行了综合考察。
编程解题,随着题目难度的增加,我们要养成习惯,写代码前先理清思路,列出算法步骤,每一步解决一个问题。最后,我们再按照步骤一步步去用代码实现。
我们就以此题为例,首先列出算法步骤:
- 读取输入
- 算出每个学生的编号 的和 ,将它们保存到对应的动态数组中。
2.1 此处,计算各位数字之和,我们可以使用一个函数来实现功能,代码会更加简洁和清晰。
2.2 我们怎样设置一个动态数组保存呢? 观察题目,正整数 最大值为 ,那么各位数字之和的最大值是不是 这个情况,也就是 54, 那么声明 55 个元素的数组就可以啦,数组又分别是一个动态数组,(对于新手)这里请仔细思考和理解。 - 根据求出的和,把每个编号 保存到对应的动态数组,最后再遍历这 55 个元素,找出元素最多的动态数组,元素同样多选组号最小的。
- 对该组进行从大到小的排序。
- 输出结果。
根据这个步骤,我们可以写出以下代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int sum(int x){ // 对编号 a 求和的函数
int SUM = 0;
while(x > 0){
SUM += x % 10;
x /= 10;
}
return SUM;
}
int main(){
int n;
cin >> n;
int stu[n];
for(int i=0; i<n; i++){
cin >> stu[i];
}
vector<int> group[55]; // 动态数组的数组,根据编号a的和进行保存
for(int i=0; i<n; i++){
int SUMM = sum(stu[i]);
group[SUMM].push_back(stu[i]);
}
int Max_num = 0;
int group_id = 0;
for(int i=1; i<=54; i++){
if(group[i].size() > Max_num){
Max_num = group[i].size();
group_id = i;
}
}
sort(group[group_id].begin(),group[group_id].end(), greater<int>()); // 排序
cout << group_id << endl;
for(int i=0; i<group[group_id].size();i++){
cout << group[group_id][i] << " ";
}
return 0;
}