每日一题之成绩排序
在N(N<30)名运动员参加的体操比赛中,有K(K<10)名裁判给每位运动员分别打分,
按规则每名运动员最后得分需去掉一个最高分和一个最低分,
然后把其他裁判的打分相加,计算得出该运动员的总得分(规定数据中每名运动员的总得分各不相同)。
现在比赛完毕,根据总得分高低排序得出冠军、亚军。请你帮忙算出冠军和亚军,并输出他们的姓名。
输入说明:
第一行输入整数N和K。N表示运动员人数,K表示裁判人数;
从第二行开始,依次分行输入这N名运动员的数据(数据格式为:姓名 各裁判的整数打分)
输出说明:
输出冠军姓名及得分
测试数据:
输入:
2 3
张三
20 28 30
李四
28 26 25
输出:
冠军: 张三, 总得分: 28
亚军: 李四, 总得分: 26
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Athlete {string name;vector<int> scores;int totalScore;
};// 自定义比较函数,用于按得分排序
bool compareAthletes(const Athlete &a, const Athlete &b) {return a.totalScore > b.totalScore;
}int main() {int N, K;cin >> N >> K;vector<Athlete> athletes(N);for (int i = 0; i < N; ++i) {cin >> athletes[i].name;athletes[i].scores.resize(K);for (int j = 0; j < K; ++j) {cin >> athletes[i].scores[j];}int maxScore = *max_element(athletes[i].scores.begin(), athletes[i].scores.end());int minScore = *min_element(athletes[i].scores.begin(), athletes[i].scores.end());athletes[i].totalScore = 0;for (int score : athletes[i].scores) {athletes[i].totalScore += score;}athletes[i].totalScore -= (maxScore + minScore); // 去掉最高分和最低分}// 按总得分排序sort(athletes.begin(), athletes.end(), compareAthletes);// 输出冠军和亚军cout << "冠军: " << athletes[0].name << ", 总得分: " << athletes[0].totalScore << std::endl;cout << "亚军: " << athletes[1].name << ", 总得分: " << athletes[1].totalScore << std::endl;return 0;
}
这道题的思路主要是计算得分是去掉最高分和最低分,我这里选择先找出最大值和最小值,然后计算出总分,再减去最大值和最小值