这一题我觉得做起来还比较麻烦,尤其是各种隐藏条件还比较多。
首先要注意的是ID是连续的,不是像其他排序题那样随意给出,另外你要考虑到没submit答案的数据和submit但没complier成功的数据是不同的。尽管题目中说到题目都没有submit和submit但没complier成功的用户都是不允许出现在list里面,但是只要用户submit答案,那么他的记录就不会出现“-”的情况,所以说这两者并不是等价的。
算法步骤:
- 新建结构体数组,并初始化数组
- 编写比较函数
- 将输入数据存储到数组中,并将符合条件的用户进行标记
- 统计用户的总分以及完美答题数量
- 排序
- 获取排序后的用户序号
- 根据标记筛选条件的用户,并输出用户信息
关键点:
- 题目得分是高分覆盖低分
- 编译没有通过的答案表现为0分
- 符合条件的用户要保证至少有一道题目编译成功
核心代码:
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &tempID, &problemID, &score);
if (score >= 0)
{
if (users[tempID].score[problemID - 1] <= score)
{
users[tempID].score[problemID - 1] = score;
}
users[tempID].flag = true;
}
else if (score == -1 && users[tempID].score[problemID - 1] == -1)
{
users[tempID].score[problemID - 1] = 0;
}
}
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10005