算法
模拟
题目描述
现给出一场ACM赛制的比赛,要求计算选手的排名。
给出比赛的题目数,单位罚时,以及每个选手每个题目的情况,要求按排名输出选手以及其题目数、罚时数。
解题思路
统计每名选手的题目数、罚时数,使用多值排序获得名次。
代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
int n, m;
struct At {
string name;
int sum;
int tm;
};
At stu[10010];
void suan(int cnt, string s) {
if (s[0] == '-')
return;
if (s[0] == '0')
return;
int ii = 0;
int ans = 0;
while (s[ii] >= '0'&&s[ii] <= '9') {
ans *= 10;
ans += (s[ii] - '0');
ii++;
}
stu[cnt].sum++;
stu[cnt].tm += ans;
if (s[ii] != '(')
return;
ii ++;
ans = 0;
while (s[ii] >= '0'&&s[ii] <= '9') {
ans *= 10;
ans += (s[ii] - '0');
ii++;
}
stu[cnt].tm += (m*ans);
return;
}
bool cmp(At a, At b) {
if (a.sum == b.sum) {
if (a.tm < b.tm)
return a.name < b.name;
else return a.tm < b.tm;
}
return a.sum > b.sum;
}
int main() {
cin >> n >> m;
string s;
int cnt = 0;
while (cin >> s) {
stu[++cnt].name = s;
for (int i = 1; i <= n; i++) {
cin >> s;
suan(cnt, s);
}
}
sort(stu + 1, stu + 1 + n, cmp);
for (int i = 1; i <= cnt; i++) {
cout << std::left << setw(10) << stu[i].name << ' ';
cout << std::right << setw(2) << stu[i].sum << ' ';
cout << std::right << setw(4) << stu[i].tm << endl;
}
return 0;
}
题目总结
本题并无考察实际的算法,主要考察输入以及相应的细节处理。代码中在读入 x(t) 类型数据时,采用先读入整数,在读入字符判断是否为“(”,如是再读入整数的方式;这种方式相对较为复杂,可使用 sacnf("%d(%d)") 以简便地读入。另外,应注意输出格式。
由于数据量很小,故不需要考虑时间及空间复杂度。