主要是用结构体来做,注意统计规则,有0分及0分以上的提交,总的算有效提交,其余的算无效提交(编译错误题目算提交过)
①提交得0分,题目得0分,算有效提交
②提交得-1分,题目算0分,但只算无效提交
③没有提交过,题目算“-”
其他方面就是准考证从0开始,因而sort(user,user+10000,cmp)是不对的,最后一个测试点通不过
改成sort(user,user+10001,cmp)即可通过。但实际上准考证是[1,N],故sort(user+1,user+n+1,cmp)即可。
注意满分数不要重复记录
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct user{
int userid; //记录ID,因为排序后顺序会乱掉
int problem_score[5]={0}; //所有的初始分为0分
int total_score=0; //总分
int range=0; //排名
int perfect_num=0; //满分数
bool flag[5]={false}; // 看题目有没有提交,编译不过也算提交过
bool sub = false; //是否是有效提交
}users[10020];
int k,mark[5]; //cmp要用到,故写到全局
bool cmp(user a,user b){
if (a.sub!=b.sub) return a.sub>b.sub; //排序先排有没有有效提交 ,再按总分、满分数、ID排
else if (a.total_score!=b.total_score) return a.total_score>b.total_score;
else if (a.perfect_num!=b.perfect_num) return a.perfect_num>b.perfect_num;
else return a.userid<b.userid;
}
int main(){
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
for (int i=0;i<k;i++){ //读取题目分值
scanf("%d",&mark[i]);
}
for (int i=0;i<m;i++){
int userid,proid,prosc;
scanf("%d%d%d",&userid,&proid,&prosc);
users[userid].userid=userid; //保存题目ID
if (users[userid].problem_score[proid-1]<prosc) {
//如果分数高,就更新,注意如果写<=,会产生满分数重复的情况,所以写<,
//但写了<,0分无法记录,所以0单独考虑
if (prosc==mark[proid-1]) users[userid].perfect_num++; //记录满分数
users[userid].total_score-=users[userid].problem_score[proid-1]; //总分先减去之前的分值
users[userid].problem_score[proid-1]=prosc; //更新分数
users[userid].total_score+=users[userid].problem_score[proid-1]; // 总分更新
users[userid].flag[proid-1]=true; //此题算提交
users[userid].sub=true; //总的算有效提交
}
else if(prosc==0){ //0分的话,分值不更新,但其余算有效提交
users[userid].flag[proid-1]=true;
users[userid].sub=true;
}
else if (prosc==-1){ //编译错误,只有题目算提交过,其余不变
users[userid].flag[proid-1]=true;
}
}
sort(users+1,users+n+1,cmp); //users[0]是空的,故从user[1]开始,故为n+1
users[1].range=1;
printf("%d %05d %d",users[1].range,users[1].userid,users[1].total_score);
for (int i=0;i<k;i++){
if (users[1].flag[i]==false) printf(" -");
else printf(" %d",users[1].problem_score[i]);
}
printf("\n");
for (int i=2;i<=n;i++){
if (users[i].sub==false) break;
if(users[i].total_score==users[i-1].total_score) users[i].range=users[i-1].range;
else users[i].range = i;
printf("%d %05d %d",users[i].range,users[i].userid,users[i].total_score);
for (int j=0;j<k;j++){
if (users[i].flag[j]==false) printf(" -");
else printf(" %d",users[i].problem_score[j]);
}
printf("\n");
}
return 0;
}