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;
}

 

posted @ 2024-02-15 16:52  interior  阅读(20)  评论(0)    收藏  举报