专栏文章

题解:P11950 [科大国创杯初中组 2023] 评分

P11950题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipups31
此快照首次捕获于
2025/12/03 18:15
3 个月前
此快照最后确认于
2025/12/03 18:15
3 个月前
查看原文
~哈哈大氵怪终于找到会做并且能交题解的题目了!!~

1. 数据结构设计原理

选手结构体 Player
CPP
struct Player {
    int id;  // 选手编号
    double score;  // 选手得分
};
这里定义了一个 Player 结构体,用于存储每位选手的关键信息。id 用于唯一标识选手,而 score 则记录选手的最终得分。使用结构体可以将选手的不同属性组合在一起,方便后续对选手信息进行统一管理和操作。 动态数组 vector
CPP
vector<Player> players(n);
vector<int> scores(m);
使用 vector 容器来存储选手信息和评委打分。vector 是 C++ 标准库中的动态数组,它可以根据需要自动调整大小,方便存储不同数量的数据。players 存储了所有选手的信息,而 scores 则临时存储单个选手的所有评委打分。这种动态数组的使用使得代码可以灵活处理不同数量的选手和评委,提高了代码的通用性。

2. 评分计算原理

去除最高分和最低分
CPP
sort(scores.begin(), scores.end());
double sum = 0;
for (int k = 1; k < m - 1; ++k) {
    sum += scores[k];
}
players[i].score = sum / (m - 2); 在计算选手得分时,先对评委的打分进行排序(升序),这样最高分和最低分就分别位于数组的末尾和开头。然后通过循环跳过第一个(最低分)和最后一个(最高分)元素,将中间的分数累加起来。最后将累加的分数除以有效打分的个数 m - 2,得到选手的最终得分。这种方法可以避免个别评委的极端打分对选手最终成绩产生过大影响,使评分更加公平合理。

3. 排序原理

自定义比较函数 compare
CPP
bool compare(Player a, Player b) {
    if (a.score != b.score) {
        return a.score > b.score;
    }
    return a.id < b.id;
}
compare 函数是一个自定义的比较函数,用于在排序时确定元素的先后顺序。在这个函数中,首先比较两位选手的得分,如果得分不同,则得分高的选手排在前面;如果得分相同,则编号小的选手排在前面。 使用 sort 函数排序
CPP
sort(players.begin(), players.end(), compare);
sort 是 C++ 标准库中的排序函数,它可以对容器中的元素进行排序。通过传入自定义的比较函数 compare,可以按照我们期望的规则对选手进行排序,最终得到选手的排名。

4. 输出原理

CPP
for (int i = 0; i < n; ++i) {
    cout << players[i].id;
    if (i != n - 1) {
        cout << " ";
    }
}
经过排序后,players 容器中的选手已经按照排名顺序排列。通过遍历这个容器,依次输出每个选手的编号,并且在编号之间添加空格分隔,最终输出的结果就是选手的排名顺序。 综上所述,这段代码通过合理的数据结构设计、公平的评分计算方法、灵活的排序规则以及清晰的输出方式,实现了对跳水比赛选手的排名功能。
CPP
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义选手结构体,包含选手编号和得分
struct Player {
    int id;  // 选手编号
    double score;  // 选手得分
};
// 比较函数,用于对选手按得分从高到低排序,得分相同按编号从小到大排序
```cpp
bool compare(Player a, Player b) {
    if (a.score != b.score) {
        return a.score > b.score;
    }
    return a.id < b.id;
}

int main() {
    int n, m;  // n表示选手个数,m表示评委个数
    cin >> n >> m;

    vector<Player> players(n);  // 创建选手数组,存储每个选手信息
    for (int i = 0; i < n; ++i) {
        players[i].id = i + 1;  // 选手编号从1开始
        vector<int> scores(m);  // 存储每个选手的所有评委打分
        for (int j = 0; j < m; ++j) {
            cin >> scores[j];  // 输入每个评委的打分
        }
        // 对评委打分进行排序,方便去掉最大值和最小值
        sort(scores.begin(), scores.end());
        double sum = 0;
        for (int k = 1; k < m - 1; ++k) {
            sum += scores[k];  // 累加去掉最大值和最小值后的分数
        }
        players[i].score = sum / (m - 2);  // 计算选手最终得分
    }

    // 对选手按得分和编号进行排序
    sort(players.begin(), players.end(), compare);

    // 输出选手排名
    for (int i = 0; i < n; ++i) {
        cout << players[i].id;
        if (i != n - 1) {
            cout << " ";
        }
    }

    return 0;
}

拒绝copy!!!

严查
@chen_zhe 让我过一篇题解叭~ [好不容易写的]

评论

0 条评论,欢迎与作者交流。

正在加载评论...