每道题有四种状态:{- , -1 , 0 , >0 }
因此一开始初始化每道题不能是0,要不然不好区分;
最好不是-1,当然可以是-1;
为了可读性,最好初始化为-2
每个人的分数有显示和不显示两种状态
提交过即使是0分,人少的时候也必须显示;
所以总的score也不能初始化为0,防止提交过0分和没有提交过的混淆
最好也定义成一个负数
#include <iostream>
#include <algorithm>
using namespace std;
struct user
{
int id;
int problem[6];
int score;
int accnt;
};
bool cmp(user a,user b){
if(a.score==b.score){
if(a.accnt==b.accnt) return a.id<b.id;
else return a.accnt>b.accnt;
}else return a.score>b.score;
}
int main(){
int n,k,m;
cin>>n>>k>>m;
user u[n+1];
for(int i=1;i<=n;i++){
u[i].id=i;
fill(u[i].problem,u[i].problem+6,-2);
u[i].score=-2;
u[i].accnt=0;
}
int full_score[k+1];
for(int i=1;i<=k;i++){
cin>>full_score[i];
}
int tmpid,tmppid,tmpscore;
while(m--){
scanf("%5d %d %d",&tmpid,&tmppid,&tmpscore);
//未编译通过
if(tmpscore==-1){
if(u[tmpid].problem[tmppid]==-2) u[tmpid].problem[tmppid]=-1;
}else{
if(u[tmpid].problem[tmppid]<tmpscore){
u[tmpid].problem[tmppid]=tmpscore;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
if(u[i].problem[j]>=0){
if(u[i].score==-2) u[i].score=u[i].problem[j];
else u[i].score+=u[i].problem[j];
}
if(u[i].problem[j]==full_score[j]) u[i].accnt++;
}
}
sort(u+1,u+n+1,cmp);
int flag=0;
int cur_rank=1,cur_score=u[1].score;
for(int i=1;i<=n;i++){
if(u[i].score>=0){
if(flag) printf("\n");
if(u[i].score!=cur_score){
cur_score=u[i].score;
cur_rank=flag+1;
}
printf("%d",cur_rank);
printf(" %05d",u[i].id);
printf(" %d",u[i].score);
for(int j=1;j<=k;j++){
if(u[i].problem[j]>=0) printf(" %d",u[i].problem[j]);
else if(u[i].problem[j]==-1) printf(" 0");
else printf(" -");
}
flag++;
}
}
return 0;
}