【PAT甲级】1075 PAT Judge (25 分)
题意:
输入三个正整数N,K,M(N<=10000,K<=5,M<=100000),接着输入一行K个正整数表示该题满分,接着输入M行数据,每行包括学生的ID(五位整数1~N),题号和该题得分(-1表示没通过编译)。输出排名,学生ID,总分和每一题的得分,第一优先为总分降序,第二优先为题目AC数降序,第三优先为学生ID升序(提交但未通过编译得分为0,未提交得分为-,不输出没有提交或者提交全都未通过编译的学生信息)。
trick:
测试点4为有学生先交了得到分的程序后该题后来又交了未通过编译的程序,注意分支结构不要出错。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef struct student{ 5 int id; 6 int score[7]; 7 int sum; 8 int num; 9 }; 10 student a[10007],b[10007]; 11 int total[7]; 12 bool cmp(student x,student y){ 13 if(x.sum!=y.sum) 14 return x.sum>y.sum; 15 if(x.num!=y.num) 16 return x.num>y.num; 17 return x.id<y.id; 18 } 19 int main(){ 20 int n,k,m; 21 scanf("%d%d%d",&n,&k,&m); 22 for(int i=1;i<=n;++i) 23 for(int j=1;j<=k;++j) 24 a[i].score[j]=-1; 25 for(int i=1;i<=k;++i) 26 scanf("%d",&total[i]); 27 for(int i=1;i<=m;++i){ 28 int id,num,val; 29 scanf("%d%d%d",&id,&num,&val); 30 if(val>-1) 31 a[id].id=id; 32 else if(a[id].score[num]<0) 33 a[id].score[num]=0; 34 if(val>a[id].score[num]) 35 a[id].score[num]=val; 36 } 37 int cnt=0; 38 for(int i=1;i<=n;++i) 39 if(a[i].id){ 40 b[++cnt]=a[i]; 41 for(int j=1;j<=k;++j){ 42 b[cnt].sum+=max(0,b[cnt].score[j]); 43 if(b[cnt].score[j]==total[j]) 44 ++b[cnt].num; 45 } 46 } 47 sort(b+1,b+1+cnt,cmp); 48 int rank_=0; 49 b[0].sum=1e9; 50 for(int i=1;i<=cnt;++i){ 51 if(b[i].sum<b[i-1].sum) 52 rank_=i; 53 printf("%d %05d %d",rank_,b[i].id,b[i].sum); 54 for(int j=1;j<=k;++j) 55 if(b[i].score[j]==-1) 56 printf(" -"); 57 else 58 printf(" %d",b[i].score[j]); 59 printf("\n"); 60 } 61 return 0; 62 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)