top1编程
← 返回题目
题解

【基础】仰卧起坐成绩统计

1 条题解

  • 0
    @ 2026-7-31 14:40:48

    解题思路

    题目要求统计每个成绩区间的人数,然后按人数从多到少输出,人数一样时成绩好的先输出。

    成绩区间:

    • 大于等于 60:A
    • 50~59:B
    • 40~49:C
    • 30~39:D
    • 20~29:E
    • 小于 20:F

    思路:

    1. 用一个数组 cnt 统计 A~F 各区间人数
    2. 排序:按人数降序
    3. 注意:人数一样时,成绩好的(等级靠前的)先输出,所以排序要稳定(相等的元素保持原顺序)

    为什么用稳定排序? 如果人数相同(比如 E 和 F 都是 3 人),要求成绩好的 E 先输出。稳定排序不会交换相等的元素,所以 A~F 的顺序保持下来,等级高的自然在前。

    举例:10 个同学成绩统计后:

    • A:0 B:1 C:2 D:1 E:3 F:3
    • 按人数降序:E:3 F:3 C:2 B:1 D:1 A:0(E 和 F 同人数,E 在前)

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, cnt[6] = {0};
        char g[6] = {'A', 'B', 'C', 'D', 'E', 'F'};
        cin >> n;
    
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            if (x >= 60) cnt[0]++;
            else if (x >= 50) cnt[1]++;
            else if (x >= 40) cnt[2]++;
            else if (x >= 30) cnt[3]++;
            else if (x >= 20) cnt[4]++;
            else cnt[5]++;
        }
    
        // 冒泡排序(稳定),人数降序,同人数保持 A~F 顺序
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 5 - i; j++) {
                if (cnt[j] < cnt[j + 1]) {
                    int t = cnt[j]; cnt[j] = cnt[j + 1]; cnt[j + 1] = t;
                    char c = g[j]; g[j] = g[j + 1]; g[j + 1] = c;
                }
            }
        }
    
        for (int i = 0; i < 6; i++) {
            cout << g[i] << ":" << cnt[i] << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),统计加排序(6 个区间固定)
    • 空间复杂度:O(1)
    • 1