注意这句话:For those who has never submitted any solution that can pass the compiler, or has never submitted any solution, they must NOT be shown on the ranklist.
意思是 提交都没通过编译 和 没提交任何题目 的人不出现在排名表中,因此不能仅通过总分是否为0来判断(可能有人通过编译了但答案一个都不正确,总分为0
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct person {
int id;
int rank;
int score;
int perfect;
int part[5];
bool show;
};
vector<person>info;
int full[5];
bool compare(person p1, person p2) {
if (p1.score != p2.score) return p1.score > p2.score;
if (p1.perfect != p2.perfect) return p1.perfect > p2.perfect;
if (p1.id != p2.id) return p1.id < p2.id;
}
int main() {
int N, K, M;
cin >> N >> K >> M;
info.resize(N);
for (int i = 0; i < N; i++) {
info[i].id = i + 1;
info[i].score = info[i].perfect = 0;
fill(info[i].part, info[i].part + K, -1);
info[i].show = 0;
}
for (int i = 0; i < K; i++)
cin >> full[i];
for (int i = 1; i <= M; i++) {
int d, p, s;
scanf("%05d %d %d", &d, &p, &s);
if (s < info[d - 1].part[p - 1]) continue;
info[d - 1].part[p - 1] = (s==-1)?0:s;
if (info[d - 1].show == 0 && s != -1) info[d - 1].show = 1;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < K; j++) {
info[i].score += (info[i].part[j]==-1)?0:info[i].part[j];
if (info[i].part[j] == full[j])
info[i].perfect++;
}
}
sort(info.begin(), info.end(), compare);
for (int i = 0; i < N; i++) {
if (info[i].show==0) continue;
if (i == 0) info[i].rank = 1;
else if (info[i].score == info[i - 1].score)
info[i].rank = info[i - 1].rank;
else info[i].rank = i + 1;
printf("%d %05d %d ", info[i].rank, info[i].id, info[i].score);
for (int j = 0; j < K; j++) {
if (info[i].part[j] == -1) cout << "-";
else cout << info[i].part[j];
if (j != K - 1) cout << " ";
else cout << endl;
}
}
return 0;
}