【Week2实验-B】爆零×大力出奇迹√

算法

模拟

题目描述

现给出一场ACM赛制的比赛,要求计算选手的排名。
给出比赛的题目数,单位罚时,以及每个选手每个题目的情况,要求按排名输出选手以及其题目数、罚时数。

解题思路

统计每名选手的题目数、罚时数,使用多值排序获得名次。

代码

#include
#include
#include
#include
#include
#include
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)") 以简便地读入。另外,应注意输出格式。
由于数据量很小,故不需要考虑时间及空间复杂度。

你可能感兴趣的:(【Week2实验-B】爆零×大力出奇迹√)