1075 PAT Judge
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1075 PAT Judge相关的知识,希望对你有一定的参考价值。
1. 这一题一开始,为了同一个人的数据更新得方便,我把id从字符串转化成整数,作为数组下标,但是注意了,每个学生还是要有字符串的id属性(根据下标得到),因为后面一旦排序,数组下标就毫无意义了。
2.由于这里的很多下标都是从1开始,所以一定要注意循环的开始是1,结束要用小于等于符号
3.有一个一开始理解错的小点是,当一个人提交了但是编译没通过,该题输出的应该是0分而不是-
4.我把结构体中每道题的得分初始化为-2,是为了方便最后判断考生该题有没有提交
AC代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const double eps = 1e-3;
struct tester{
char id[6];
int s[6] = {-2,-2,-2,-2,-2,-2};
int s_total = 0;
int fullMark_n[6] = {0};
int f_total = 0;
bool ifPrint = false;
int rank = 0;
}testers[10010];
bool cmp(tester a,tester b){
if(a.s_total!=b.s_total)return a.s_total>b.s_total;
else if(a.f_total!=b.f_total)return a.f_total>b.f_total;
else return strcmp(a.id,b.id)<0;
}
int main(){
int testers_n = 0;//<=10^4
int probs_n = 0;//<=5
int subms_n = 0;//<=10^5
int s[6] = {0};//每道题的分值
scanf("%d %d %d",&testers_n,&probs_n,&subms_n);
for(int i=1;i<=probs_n;i++){
scanf("%d",&s[i]);
}
char idStr[6];//读到的id
int id;//id转化为整数
int proNo;//读到的问题序号
int score;//读到的得分
for(int i=1;i<=subms_n;i++){
scanf("%s %d %d",idStr,&proNo,&score);
sscanf(idStr,"%d",&id);
//首先判断能否打印
if(score>-1){
testers[id].ifPrint = true;
//再判断是否大于当前该生该题得分
if(score>testers[id].s[proNo])testers[id].s[proNo] = score;
//再判断该生该题得分是否为满分
if(score==s[proNo])testers[id].fullMark_n[proNo] = 1;
}else{
//再判断是否大于当前该生该题得分
if(score>testers[id].s[proNo])testers[id].s[proNo] = 0;//既然提交了就算编译没通过也是0而不是-
}
}
for(int i=1;i<=testers_n;i++){
//算出每个学生的总分
for(int j=1;j<=probs_n;j++){
if(testers[i].s[j]!=-2){
testers[i].s_total += testers[i].s[j];
}
}
//算出每个学生满分的题数
for(int j=1;j<=probs_n;j++){
testers[i].f_total += testers[i].fullMark_n[j];
}
//将数组下标赋予给每个tester作为id,因为数组下标排序后就不起作用
sprintf(testers[i].id,"%05d",i);
}
sort(testers+1,testers+testers_n+1,cmp);
testers[1].rank = 1;
for(int i=2;i<=testers_n;i++){
if(testers[i].ifPrint){
if(testers[i].s_total==testers[i-1].s_total){
testers[i].rank = testers[i-1].rank;
}else{
testers[i].rank = i;
}
}
}
for(int i=1;i<=testers_n;i++){
if(testers[i].ifPrint){
printf("%d %s %d",testers[i].rank,testers[i].id,testers[i].s_total);
for(int j=1;j<=probs_n;j++){
if(testers[i].s[j]!=-2)printf(" %d",testers[i].s[j]);
else printf(" -",testers[i].s[j]);
}
printf("\\n");
}
}
}
以上是关于1075 PAT Judge的主要内容,如果未能解决你的问题,请参考以下文章