如下测试数据:
3 1 5
10
00001 1 -1
00001 1 0
00002 1 2
00004 1 -1
00002 1 2
正确结果应该为:
1 00002 2 2
2 00001 0 0
错误结果为:
1 00002 2 2
也就是说,如果一个学生编译不通过(即,分数为-1), 不显示。而,如果一个学生本身就得了0 分, 则应该显示。
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int p[6]={0};
struct student{
int id;
int total;
int score[5];
bool isPrint;
int count;
student(){
id = 0;
total = 0;
score[0] = -1; score[1] = -1;score[2] = -1;score[3] = -1;score[4] = -1;
isPrint = 0; count = 0;
}
}stu[10005] ;
student stu2[10005];
bool cmp(student x, student y){
if(x.total != y.total) return x.total> y.total;
else if(x.count != y.count) return x.count>y.count;
else return x.id<y.id;
}
int main(){
int n,k,m;
int id,number,grade;
scanf("%d %d %d",&n,&k,&m);
for(int i=0;i<k;i++){
scanf("%d",&p[i]);
}
for(int i=0;i<m;i++){
scanf("%d %d %d",&id, &number, &grade);
if(stu[id].id !=0){
number -- ;
if(grade!=-1) stu[id].isPrint = 1;
if(grade==-1) grade = 0;
if(stu[id].score[number] < grade && grade<=p[number] ){
stu[id].score[number] = grade;
}
}else{
stu[id].id = id;
if(grade!=-1) stu[id].isPrint = 1;
if(grade==-1) grade = 0;
number -- ;
stu[id].score[number] = grade;
}
}
for(int i=0;i<=n;i++){
int sum=0,count=0;
for(int j=0;j<k;j++){
if(stu[i].score[j] != -1)
sum+= stu[i].score[j];
if(stu[i].score[j] == p[j]) count++;
}
stu[i].total = sum;
stu[i].count = count;
}
sort(stu, stu+n+1, cmp);
int s1=0;
for(int i=0;i<=n;i++){
if(stu[i].isPrint == 0) continue;
stu2[s1++] = stu[i];
}
int r=1;
for(int i=0;i<s1;i++){
if(i>0 && stu2[i].total == stu2[i-1].total)
printf("%d %05d",r,stu2[i].id);
else{
r=i+1;
printf("%d %05d",r,stu2[i].id);
}
printf(" %d",stu2[i].total);
for(int j=0;j<k;j++){
if(stu2[i].score[j] ==-1) printf(" -");
else printf(" %d",stu2[i].score[j]);
}
printf("\n");
}
return 0;
}