1075. PAT Judge (25)
思路:题目要求是对于未曾有任何提交的或者是提交了但是没有一个能通过编译的都不进行输出,但是注意,对于提交了但是编译没有通过的,得分应该是0(比如00005的第二题)
一个好的解决办法是把所有成绩初始化为-2,大于当前grade值的都进行更新,而对于只要有成绩大于0的,都应该在list里,如果值为-1,则输出0,如果值为-2,则输出-;
#include <stdio.h>
#include <stdlib.h>
struct record
{
int thisid;
int grade[5+1];
int sumscores;
int countperfect;
int islist;
int rank;
}s[10000+1];
int comp(const void*a,const void*b)
{
struct record *p=(struct record*)a,*q=(struct record*)b;
if(p->sumscores!=q->sumscores)
return q->sumscores-p->sumscores;
else if(p->countperfect!=q->countperfect)
return q->countperfect-p->countperfect;
else
return p->thisid-q->thisid;
}
int main()
{
int n,k,m,p[5+1];
scanf("%d %d %d",&n,&k,&m);
for(int i=1;i<=k;++i)
scanf("%d",&p[i]);
for(int i=1;i<=n;++i)
{
s[i].thisid=i;
s[i].grade[1]=s[i].grade[2]=s[i].grade[3]=s[i].grade[4]=s[i].grade[5]=-2;
}
for(int i=0;i<m;++i)
{
int id,sn,score;
scanf("%d %d %d",&id,&sn,&score);
if(score>s[id].grade[sn])
s[id].grade[sn]=score;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=k;++j)
{
if(s[i].grade[j]==p[j])++s[i].countperfect;
if(s[i].grade[j]>=0)
{
s[i].islist=1;
s[i].sumscores+=s[i].grade[j];
}
}
}
qsort(&s[1],n,sizeof(struct record),comp);
s[1].rank=1;
for(int i=2;i<=n;++i)
{
if(s[i].sumscores==s[i-1].sumscores)
s[i].rank=s[i-1].rank;
else
s[i].rank=i;
}
for(int i=1;i<=n;++i)
{
if(s[i].islist)
{
printf("%d %05d %d",s[i].rank,s[i].thisid,s[i].sumscores);
for(int j=1;j<=k;++j)
{
if(s[i].grade[j]==-1)
printf(" 0");
else if(s[i].grade[j]==-2)
printf(" -");
else
printf(" %d",s[i].grade[j]);
}
printf("\n");
}
}
return 0;
}