计蒜客 - 课外活动

2022-02-09  本文已影响0人  戴文KeepLearning
QQ图片20220210112022.png

题目解析
此题对于刚入门信竞的学生来说会存在一定的难度,因为它将函数、排序、动态数组这几个重要概念进行了综合考察。

编程解题,随着题目难度的增加,我们要养成习惯,写代码前先理清思路,列出算法步骤,每一步解决一个问题。最后,我们再按照步骤一步步去用代码实现。

我们就以此题为例,首先列出算法步骤:

  1. 读取输入
  2. 算出每个学生的编号 a_i 的和 S,将它们保存到对应的动态数组中。
    2.1 此处,计算各位数字之和,我们可以使用一个函数来实现功能,代码会更加简洁和清晰。
    2.2 我们怎样设置一个动态数组保存呢? 观察题目,正整数 a_i 最大值为 10^6 ,那么各位数字之和的最大值是不是 99999 这个情况,也就是 54, 那么声明 55 个元素的数组就可以啦,数组又分别是一个动态数组,(对于新手)这里请仔细思考和理解。
  3. 根据求出的和,把每个编号 a_i 保存到对应的动态数组,最后再遍历这 55 个元素,找出元素最多的动态数组,元素同样多选组号最小的。
  4. 对该组进行从大到小的排序。
  5. 输出结果。

根据这个步骤,我们可以写出以下代码:

#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;
}
上一篇下一篇

猜你喜欢

热点阅读