CF74A Room Leader 题解
Content
一场 CF 比赛有 \(n\) 个人,有 ABCDE 五道题目。在比赛过程中,参赛者还可以随时互相攻击,成功一次加 \(100\) 分,失败一次扣 \(50\)分,已知第 \(i\) 个人攻击成功了 \(plus_i\) 次,失败了 \(minus_i\) 次,并且 TA 五道题目的分数分别是 \(a_i,b_i,c_i,d_i,e_i\)。试判断出本场比赛的第一名。
Range
\(n,plus_i,minus_i\) 的范围:
\(1\leqslant n\leqslant 50,0\leqslant plus_i,minus_i\leqslant 50\)。
\(a_i,b_i,c_i,d_i,e_i\) 的范围:
\(150\leqslant a_i\leqslant 500,300\leqslant b_i\leqslant 1000,450\leqslant c_i\leqslant 1500,600\leqslant d_i\leqslant 2000,750\leqslant e_i\leqslant 2500\)。但是其中 \(a_i,b_i,c_i,d_i,e_i\) 中的任意一个都可以为 \(0\),代表五个问题中可能会有没解决出来的。
Solution
这道题目属于看完了以后立马就会有思路的,也就是说,我们可以用模拟的方法解决。
可以很明显的知道,第 \(i\) 为参赛者的得分就是 \(100\cdot plus_i-50\cdot minus_i+a_i+b_i+c_i+d_i+e_i\),计算完分数后再按照分数为关键字排序,输出第一位的名字就可以通过这道题目了。
Code
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct user {
string name;
int win, lose, ai, bi, ci, di, ei;
long long score;
bool operator < (const user& kkk) const {return score > kkk.score;}
}a[57];
int n;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
cin >> a[i].name;
scanf("%d%d%d%d%d%d%d", &a[i].win, &a[i].lose, &a[i].ai, &a[i].bi, &a[i].ci, &a[i].di, &a[i].ei);
a[i].score = a[i].win * 100 - a[i].lose * 50 + a[i].ai + a[i].bi + a[i].ci + a[i].di + a[i].ei;
}
sort(a + 1, a + n + 1);
cout << a[1].name;
return 0;
}

浙公网安备 33010602011771号