#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int id;int goals[6];int totalScore;int perDis;int rank;bool show;
node(){
fill(goals,goals+6,-1);
totalScore=0;
perDis=0;
show=false;
}
bool operator < (const node &a) const{
if(totalScore!=a.totalScore)
return totalScore>a.totalScore;
else if(perDis!=a.perDis)
return perDis>a.perDis;
else if(show!=a.show)
return show>a.show;
else return id<a.id;
}
};
node Stu[100005];
int FullMark[6];
int main(){
int N,K,M;
scanf("%d%d%d",&N,&K,&M);
for(int i=1;i<=K;i++)
scanf("%d",&FullMark[i]);
for(int i=0;i<M;i++){
int id,pro,goal;
scanf("%d%d%d",&id,&pro,&goal);
Stu[id].id=id;
if(goal>=0) Stu[id].show=true;
if(goal==-1) goal=0;
if(goal>Stu[id].goals[pro]){
if(Stu[id].goals[pro]!=-1)
Stu[id].totalScore=Stu[id].totalScore-Stu[id].goals[pro]+goal;
else Stu[id].totalScore+=goal;
Stu[id].goals[pro]=goal;
if(Stu[id].goals[pro]==FullMark[pro])
++Stu[id].perDis;
}
}
sort(Stu+1,Stu+N+1);
//获取排名;
for(int i=1;i<=N;i++){
if(Stu[i].show){ //有资格输出;
if(i==1||Stu[i].totalScore!=Stu[i-1].totalScore)
Stu[i].rank=i;
else
Stu[i].rank=Stu[i-1].rank;
printf("%d %05d %d",Stu[i].rank,Stu[i].id,Stu[i].totalScore);
for(int j=1;j<=K;j++){
if(Stu[i].goals[j]!=-1)
printf(" %d",Stu[i].goals[j]);
else printf(" -");
}
printf("\n");
}
}
system("pause");
return 0;
}
注意:
(1) 可能存在不符合显示条件的同学和提交的分为0的同学排名相同但是前者的id要比后者的小,因此,排序时,前者在后者之前。为了避免出现由于某一位没有排名导致后面的同学排名显示错误,排序时要将show为true的同学显示在前面;或者是在输出时,给出N个·同学的排名,但是只显示show为true的同学。
(2) 统计满分题目个数时,为避免同一道题重复满分的情况,要在当前分数比已经存在分数高时才增加perfectly solved problem的数目(当然当前goal要是满分)。