top1编程
← 返回题目
题解

【入门】遥控飞机争夺赛

1 条题解

  • 0
    @ 2026-7-31 14:43:09

    解题思路

    每位选手飞 5 次,去掉一次最高分、一次最低分,剩下 3 次求平均作为最终成绩,然后按成绩排出前三名。

    思路:

    1. 算每位选手的最终成绩:把 5 次成绩排序,去掉第一个(最小)和最后一个(最大),中间 3 个求平均
    2. 按成绩从高到低排序:成绩高的是冠军
    3. 输出前三名:冠军、亚军、季军,成绩保留 3 位小数

    为什么要排序 5 次成绩? 排好序后最小的一定在第一个、最大的一定在最后一个,直接去掉两端,剩下的就是中间的 3 个,很方便。

    怎么算平均分? 中间 3 个的和除以 3,要注意用 3.0(小数)做除法,否则整数除法会丢小数。

    举例:选手 23 的成绩 65 64 63 62 62

    • 排序后 62 62 63 64 65
    • 去掉 62 和 65,中间是 62 63 64
    • 平均 (62+63+64)÷3 = 63

    参考代码

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int id[105];
    double score[105];
    
    int main() {
        int n;
        cin >> n;
    
        for (int i = 0; i < n; i++) {
            int s[5];
            cin >> id[i];
            for (int j = 0; j < 5; j++) cin >> s[j];
    
            // 5 次成绩排序
            for (int j = 0; j < 5; j++) {
                for (int k = 0; k < 4 - j; k++) {
                    if (s[k] > s[k + 1]) {
                        int t = s[k]; s[k] = s[k + 1]; s[k + 1] = t;
                    }
                }
            }
    
            // 去掉最大最小,中间三个平均
            score[i] = (s[1] + s[2] + s[3]) / 3.0;
        }
    
        // 按成绩从高到低排序
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (score[j] < score[j + 1]) {
                    double t = score[j]; score[j] = score[j + 1]; score[j + 1] = t;
                    int k = id[j]; id[j] = id[j + 1]; id[j + 1] = k;
                }
            }
        }
    
        cout << fixed << setprecision(3);
        for (int i = 0; i < 3; i++) {
            cout << id[i] << " " << score[i] << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N²),排序选手
    • 空间复杂度:O(N),存编号和成绩
    • 1