坑点:
①全部通过编译但总分为零时,需要输出该用户信息
②多次提交同一题且都为满分时,注意满分次数不能累加(没注意就过不了测试点4)
③全部未提交以及全部未通过编译时,不需要输出该用户信息
直接贴代码
代码
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=100010;
struct User{
int id;
int score[6];
int isprint;
int total;
int perfect;
}stu[maxn];
bool cmp(User a,User b){
if(a.total!=b.total){
return a.total>b.total;
}else{
if(a.perfect!=b.perfect){
return a.perfect>b.perfect;
}else{
return a.id<b.id;
}
}
}
int main(){
int n,k,m;
int p[6];
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=n;i++){ //初始化
stu[i].id=i;
stu[i].isprint=0;
stu[i].perfect=0;
stu[i].total=0;
for(int j=1;j<=k;j++){
stu[i].score[j]=-1;
}
}
for(int i=1;i<=k;i++){
scanf("%d",&p[i]);
}
for(int i=0;i<m;i++){ //录入信息
int problem=0;
int grade=0;
int ID=0;
scanf("%d%d%d",&ID,&problem,&grade);
if(grade!=-1){
stu[ID].isprint=1;
}
if(grade==-1&&stu[ID].score[problem]==-1){
stu[ID].score[problem]=0;
}
if(grade==p[problem]&&stu[ID].score[problem]<p[problem]){
stu[ID].perfect++;
}
if(stu[ID].score[problem]<grade){
stu[ID].score[problem]=grade;
}
}
for(int i=1;i<=n;i++){ //计算总分
for(int j=1;j<=k;j++){
if(stu[i].score[j]!=-1){
stu[i].total+=stu[i].score[j];
}
}
}
sort(stu+1,stu+n+1,cmp); //注意下表从1开始
int ranks=1;
for(int i=1;i<=n;i++){
if(stu[i].isprint==1){
if(stu[i].total!=stu[i-1].total){
ranks=i;
}
printf("%d %05d %d",ranks,stu[i].id,stu[i].total);
for(int j=1;j<=k;j++){
if(stu[i].score[j]==-1){
printf(" -");
}else{
printf(" %d",stu[i].score[j]);
}
}
printf("\n");
}
}
return 0;
}