注意:
不参与排名: stat = 0
1.提交的题没有一道通过编译
2.没有提交过题
参与排名:
提交的题通过编译但得分全为零
卡点:
同一考生多次提交同一道题的满分答案
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
struct Stu{
int id, score[8];
int r, stat, num;
}stu[20010];
int N, K, M;
int full[10];
bool cmp(Stu s1, Stu s2){
if(s1.score[K+1] != s2.score[K+1])
return s1.score[K+1] > s2.score[K+1];
if(s1.num != s2.num)
return s1.num > s2.num;
return s1.id < s2.id;
}
void Rank(){
stu[0].r = 1;
for(int i = 2; i <= N; i++){
if(stu[i-1].score[K+1] == -1) break;
if(stu[i-1].score[K+1] == stu[i-1-1].score[K+1])
stu[i-1].r = stu[i-1-1].r;
else stu[i-1].r = i;
}
}
int main(){
scanf("%d %d %d", &N, &K, &M);
for(int i = 1; i <= K; i++){
scanf("%d", &full[i]);
}
for(int i = 0; i <= N; i++){
for(int j = 1; j <= K+1; j++){
stu[i].score[j] = -1;
}
stu[i].stat = 0;
stu[i].num = 0;
}
int used[20010];
memset(used, -1, sizeof(used));
int id, pno, score, pos, num = 0;
for(int i = 0; i < M; i++){
scanf("%d %d %d", &id, &pno, &score);
if(used[id] == -1) used[id] = num++;
pos = used[id]; stu[pos].id = id;
if(score != -1) stu[pos].stat = 1;
else if(score == -1) score = 0;
if(full[pno] == score && stu[pos].score[pno] != score) stu[pos].num++;
//卡点:没有考虑同一考生对某道题多次提交满分答案
stu[pos].score[pno] = max(stu[pos].score[pno], score);
}
for(int i = 0; i < N; i++){
if(stu[i].stat == 0) continue;
stu[i].score[K+1] = 0;
for(int j = 1; j <= K; j++){
if(stu[i].score[j] > 0)
stu[i].score[K+1] += stu[i].score[j];
}
}
sort(stu, stu+N, cmp);
Rank();
for(int i = 0; i < N; i++){
if(stu[i].stat == 0) break;
printf("%d %05d %d", stu[i].r, stu[i].id, stu[i].score[K+1]);
for(int j = 1; j <= K; j++){
if(stu[i].score[j] == -1) printf(" -");
else printf(" %d", stu[i].score[j]);
}
putchar('\n');
}
return 0;
}