PAT甲 1075 PAT Judge
题目地址:1075 PAT Judge - PAT (Advanced Level) Practice (pintia.cn)
测试点4一开始总是过不了,搜了一下有这些可能的错误:
1、有一个人一开始得到了分数,后来提交了一次没有通过编译器的
2、当一个用户重复提交满分代码的时候,完美解题数目不再重复记录
而我的问题就离谱了,下面的代码我初始化满分时不小心从下标0开始,但是前三个点还是过了。。
for(int i=1;i<=k;i++)
scanf("%d",&s[i]);
对于问题1,有
if (vt[xu].book[ti] != 1) {
if (fen == -1) {
vt[xu].book[ti] = 0; // 只有在第一次提交未通过编译时才标记为 0
} else {
vt[xu].book[ti] = 1; // 如果是编译通过或者是之前已经编译通过的题目,标记为 1
}
}
最后,本题条件众多,需仔细。
#include <iostream> #include <algorithm>//find #include <vector> using namespace std; struct stu{ int sum=0,ac=0,num,rank; int score[7],book[7];//注意没有提交记录才输出-,即使编译未通过得分也为0 int flag=0;//能输出则必须有一题通过编译 }; int cmp1(stu a,stu b){ if(a.sum!=b.sum) return a.sum>b.sum; else if(a.ac!=b.ac) return a.ac>b.ac; else return a.num<b.num; } int main(){ int n,k,s[7],m; for(int i=0;i<7;i++){ s[i]=0; } scanf("%d %d %d",&n,&k,&m); for(int i=1;i<=k;i++) scanf("%d",&s[i]); vector<stu> vt(n+1);//注意初始化n+1个 ,不然学号作为结构体索引会越界 vector<stu> fin; for(int i=0;i<=n;i++){ vt[i].num=i; for(int j=0;j<7;j++){ vt[i].score[j]=0; vt[i].book[j]=-1; } } for(int i=0;i<m;i++){ int xu,ti,fen; scanf("%d %d %d",&xu,&ti,&fen); vt[xu].num=xu; if(fen>vt[xu].score[ti]){//编译通过自动计最高分 vt[xu].score[ti]=fen; } if(fen!=-1)//分数为0,只要编译通过也需要输出总分 vt[xu].flag=1; /*if(fen==-1&&vt[xu].book[ti]!=1)//此处分支注意先编译通过后,再次提交编译不通过而发生分支覆盖 vt[xu].book[ti]=0; else vt[xu].book[ti]=1;*/ //下面这种写法更好 if (vt[xu].book[ti] != 1) { if (fen == -1) { vt[xu].book[ti] = 0; // 只有在第一次提交未通过编译时才标记为 0 } else { vt[xu].book[ti] = 1; // 如果是编译通过或者是之前已经编译通过的题目,标记为 1 } } } for(int i=1;i<=n;i++){ if(vt[i].flag==1){ for(int j=1;j<=k;j++){ if(vt[i].book[j]==1)//book为1算sum,book为0表示编译失败,score=-1,不能算sum vt[i].sum+=vt[i].score[j]; if(vt[i].score[j]==s[j]) vt[i].ac++; } fin.push_back(vt[i]); } } sort(fin.begin(),fin.end(),cmp1); fin[0].rank=1; for(int i=1;i<fin.size();i++){ fin[i].rank=i+1; if(fin[i].sum==fin[i-1].sum) fin[i].rank=fin[i-1].rank; }//调整并列排名 for(int i=0;i<fin.size();i++){ printf("%d %05d %d ",fin[i].rank,fin[i].num,fin[i].sum); for(int j=1;j<=k;j++){ if(j!=k){//在输出时,应该使用 fin 向量中的数据进行输出,而不是 vt 向量。因为 fin 向量中存储了有效成绩的学生数据,而 vt 向量中包含了所有学生的数据,包括未参加考试的学生。 if(fin[i].book[j]==-1) printf("- "); else printf("%d ",fin[i].score[j]); }else{ if(fin[i].book[j]==-1) printf("-\n"); else printf("%d\n",fin[i].score[j]); } } } return 0; }
浙公网安备 33010602011771号