首页 > 学院 > 开发设计 > 正文

PAT-A 1075. PAT Judge (25)

2019-11-06 08:37:36
字体:
来源:转载
供稿:网友

题目链接在此。

题意

有N位考生,其准考证号是00001-N。有K个题目,编号为1-K,且每道题的分值给出。然后有M条提交记录,每个提交记录显示了该次提交的考生的准考证号、题号以及所得分数,其中分数要么是-1(表示编译不通过),要么是0到该题的满分区间内的任意整数。

现在要求所有考生按照一下顺序排序: 1. 先按K道题所得总分从高到低排序 2. 总分相同,则按照获得题目满分的题目数量从高到低排序 3. 若2也相同,则按照准考证从小到大排序

输出规则: 1. 输出每位考生的排名、准考证号、总分、每道题的各自得分,总分相同,排名相同 2. 如果某位考生全场都没有提交记录,或者没有提交能够通过编译的提交记录,则该考生信息不输出 3. 对需要输出的考生,如果提交了没有提交某道题,则该题的分数输出为“-”;如果提交了但是没有通过编译,则此题分数输出0

思路

根据题目描述,定义一个结构体,并需要一个如下结构体的数组,结构体如下:struct INFO{ int id; //学号 int num; //得满分的题目个数 int sum; //总分 int s[6]; //记录每一题得分 bool flag[6]; //记录是否提交过这个题,true表示提交过 bool F; //记录是否有通过编译的题目,true表示有 int rank; };初始化结构体数组 //init for(int i = 1; i <= N; i++){ stu[i].id = i; stu[i].num = 0; stu[i].sum = 0; stu[i].F = false; for(int j = 1; j <= K; j++){ stu[i].s[j] = 0; stu[i].flag[j] = false; } }按要求获得输入并保存,在保存的过程中需要更新一些信息:记录提交记录的每位学生每一题的分数、得满分的题目的个数、每个题的是否提交、是否有通过编译的提交记录//init for(int i = 1; i <= N; i++){ stu[i].id = i; stu[i].num = 0; stu[i].sum = 0; stu[i].F = false; for(int j = 1; j <= K; j++){ stu[i].s[j] = 0; stu[i].flag[j] = false; } }计算出每位同学的总分后根据题目要求进行排序,并得出排名 //计算每位同学的总分 for(int i = 1; i <= N; i++){ for(int j = 1; j <= K; j++){ stu[i].sum += stu[i].s[j]; }// PRintf("stu[%d].sum = %d/n",i,stu[i].sum); } sort(stu+1,stu+(N+1),cmp); //更新排名 stu[1].rank = 1; for(int i = 2; i <= N; i++){ if(stu[i].sum == stu[i-1].sum){ stu[i].rank = stu[i-1].rank; }else{ stu[i].rank = i; } }最后按要求输出for(int i = 1; i <= N; i++){ if(stu[i].F == true){ //有能通过编译的提交记录 //print rank, id, sum printf("%d %05d %d",stu[i].rank, stu[i].id, stu[i].sum); //print s[i] for(int j = 1 ; j <= K; j++){ if(stu[i].flag[j] == false){ printf(" -"); }else{ printf(" %d",stu[i].s[j]); } } printf("/n"); } }

注意点

在保存输入的过程中更新结构体数组的数据时需要注意,到底哪些信息在哪些时候是需要更新的在循环条件的符号上需要注意(我就在84行漏掉一个=,找了半天)代码是学号和下标对应,对应关系不要弄错

AC代码

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;struct INFO{ int id; //学号 int num; //得满分的题目个数 int sum; //总分 int s[6]; //记录每一题得分 bool flag[6]; //记录是否提交过这个题,true表示提交过 bool F; //记录是否有通过编译的题目,true表示有 int rank; };int scoreMap[6]; //每道题的满分 //cmp by total scorebool cmp(INFO a, INFO b){ if(a.sum != b.sum) return a.sum > b.sum; else if(a.num != b.num) return a.num > b.num; else return a.id < b.id;}int main(){ int N,K,M; scanf("%d %d %d",&N, &K, &M); INFO stu[N+1]; //init for(int i = 1; i <= N; i++){ stu[i].id = i; stu[i].num = 0; stu[i].sum = 0; stu[i].F = false; for(int j = 1; j <= K; j++){ stu[i].s[j] = 0; stu[i].flag[j] = false; } } //get full score map for(int i = 1; i <= K; i++){ //注意i的取值与 problem ID 对应 scanf("%d",&scoreMap[i]); } //get M submissions int id,pid,score; //暂存输入的submission的三个信息 while(M--){ scanf("%d %d %d",&id, &pid, &score); stu[id].flag[pid] = true; //提交过pid题 if(score != -1){ //编译通过 stu[id].F = true; //有能通过编译的提交 if(stu[id].s[pid] < score){ //记录某个题目最高的得分 stu[id].s[pid] = score; //更新某用户某一题的得分 if(score == scoreMap[pid]){ //更新得满分的题目个数 stu[id].num++; } } } } //计算每位同学的总分 for(int i = 1; i <= N; i++){ for(int j = 1; j <= K; j++){ stu[i].sum += stu[i].s[j]; }// printf("stu[%d].sum = %d/n",i,stu[i].sum); } sort(stu+1,stu+(N+1),cmp); //更新排名 stu[1].rank = 1; for(int i = 2; i <= N; i++){ if(stu[i].sum == stu[i-1].sum){ stu[i].rank = stu[i-1].rank; }else{ stu[i].rank = i; } } for(int i = 1; i <= N; i++){ if(stu[i].F == true){ //有能通过编译的提交记录 //print rank, id, sum printf("%d %05d %d",stu[i].rank, stu[i].id, stu[i].sum); //print s[i] for(int j = 1 ; j <= K; j++){ if(stu[i].flag[j] == false){ printf(" -"); }else{ printf(" %d",stu[i].s[j]); } } printf("/n"); } } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表