本题思路:
首先第一步要先算出每个队的总得分。然后用 sort 搭配 cmp 进行排序。最后直接输出就行了(非常的简单)。
注意事项:
- 题目并没有给出 $n$ 的范围,所以建议使用动态数组
vector,但实测队伍数量不超过 $10^5$。 - 记得储存队伍的顺序,
cmp的时候会用到。
上代码:
#include<bits/stdc++.h>
using namespace std;
struct team {// 队伍结构体
string c;
int sss;
int i;
int e[6];
};
bool cmp(const team& a, const team& b) {// 排序函数
if (a.sss != b.sss) return a.sss > b.sss;
return a.i < b.i;
}
int main() {
int n;
cin >> n;
vector<team> v(n);
string c;
int p, sss;
int e[6];
for (int i = 0; i < n; i++) {
cin >> c >> p;
for (int j = 0; j < 6; j++) {
cin >> e[j];
}
sort(e, e + 6);
int sum = 0;
for (int j = 1; j <= 4; j++) { // 计算蹦床得分:去掉最高和最低的 2 个分数
sum += e[j];
}
sss = p * 10 + sum; // 计算编程得分
v[i] = {c, sss, i, {e[0], e[1], e[2], e[3], e[4], e[5]}};
}
sort(v.begin(), v.end(), cmp); // 按总得分排序,如果总得分相同,按输入顺序排序
int cnt = 0;
// 输出前 3 名队伍
for (int i = 0; i < n; i++) {
if (i == 0 || v[i].sss < v[i - 1].sss) {
cnt = i;
}
if (cnt > 2) {
break;
}
cout << v[i].c << " " << v[i].sss << endl;
}
return 0;
}