【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为有学生先交了得到分的程序后该题后来又交了未通过编译的程序,注意分支结构不要出错。

代码:

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
typedef struct student{
int id;
int score[7];
int sum;
int num;
};
student a[10007],b[10007];
int total[7];
bool cmp(student x,student y){
if(x.sum!=y.sum)
return x.sum>y.sum;
if(x.num!=y.num)
return x.num>y.num;
return x.id<y.id;
}
int main(){
//ios::sync_with_stdio(false);
//cin.tie(NULL);
//cout.tie(NULL);
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=k;++j){
a[i].score[j]=-1;
}
}
for(int i=1;i<=k;++i)
scanf("%d",&total[i]);
for(int i=1;i<=m;++i){
int id,num,val;
scanf("%d%d%d",&id,&num,&val);
if(val>-1)
a[id].id=id;
else if(a[id].score[num]<0)
a[id].score[num]=0;
if(val>a[id].score[num])
a[id].score[num]=val;
}
int cnt=0;
for(int i=1;i<=n;++i){
if(a[i].id){
b[++cnt]=a[i];
for(int j=1;j<=k;++j){
b[cnt].sum+=max(0,b[cnt].score[j]);
if(b[cnt].score[j]==total[j])
++b[cnt].num;
}
}
}
sort(b+1,b+1+cnt,cmp);
int rank_=0;
b[0].sum=1e9;
for(int i=1;i<=cnt;++i){
if(b[i].sum<b[i-1].sum)
rank_=i;
printf("%d %05d %d",rank_,b[i].id,b[i].sum);
for(int j=1;j<=k;++j){
if(b[i].score[j]==-1)
printf(" -");
else
printf(" %d",b[i].score[j]);
}
printf("\n");
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11811202.html