美文网首页
计蒜客 - 课外活动

计蒜客 - 课外活动

作者: 戴文KeepLearning | 来源:发表于2022-02-09 11:34 被阅读0次
    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;
    }
    

    相关文章

      网友评论

          本文标题:计蒜客 - 课外活动

          本文链接:https://www.haomeiwen.com/subject/btenkrtx.html