7-15 PAT Judge (25分)
解题思路:
题目要求:
1、按总分降序,若总分相等,则按题目满分数目降序,若满分题目数目相等,则按学号升序
2、若全部题目均是未提交或者提交未通过,不输出
#include <stdio.h> #define MaxN 10001 #define MaxK 5+1 typedef struct{ int sum,cnt,rank,id,Rflag,Ptag[MaxK]; int num[MaxK]; } Node; int cmp(const void *a,const void *b){ Node* c = (Node*)a; Node* d = (Node*)b; if(c->sum == d->sum){ if(c->cnt == d->cnt){ return c->id > d->id; } return c->cnt < d->cnt; } return c->sum < d->sum; } int main() { int n,k,m; scanf("%d %d %d",&n,&k,&m); int i,j; int max[k+1]; Node f[n+1]; for(i=1; i<=k; i++) { scanf("%d",&max[i]); } for(i=1; i<=n; i++) {//初始化 f[i].cnt=0; f[i].rank=0; f[i].sum=0; f[i].id=i; f[i].Rflag=0; for(j=1; j<=MaxK; j++) { f[i].num[j]=0; f[i].Ptag[j]=0; } } for(i=0; i<m; i++) { int x,y,z; scanf("%d %d %d",&x,&y,&z); if(z>-1) { f[x].Rflag=1;//标记该题已提交且通过 if(f[x].num[y]<z) f[x].num[y]=z; } f[x].Ptag[y]=1;//标记该题有提交 } for(i=1; i<=n; i++) { if(f[i].Rflag) { for(j=1; j<=k; j++) { f[i].sum+=f[i].num[j]; if(f[i].num[j]==max[j])//记录满分题目数目 f[i].cnt++; } } } qsort(f+1,n,sizeof(Node),cmp); int r=1,cnt=1; f[1].rank=r; for(i=2; i<=n; i++) { cnt++; if(f[i-1].sum==f[i].sum) f[i].rank=r; else { r=cnt; f[i].rank=r; } } for(i=1; i<=n; i++) { if(f[i].Rflag) { printf("%d %05d %d",f[i].rank,f[i].id,f[i].sum); for(j=1; j<=k; j++) { if(f[i].Ptag[j]) printf(" %d",f[i].num[j]); else printf(" -"); } puts(""); } } return 0; }
勤能补拙,熟能生巧