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

算法

模拟

题目描述

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容