1075. PAT Judge (25)

题目:

https://www.patest.cn/contests/pat-a-practise/1075

大概描述:

就是将考试每次提交的成绩进行计算,并提交

特征词:

排序  系数数组

使用语言:

C++

解题思想:

大体思路就是依据代号建立数组,然后将数据进行更新,再排序

题目得分:

19

提交次数:

3

做题时间:

136分钟

具体代码如下:

#include<cstdio>
#include<algorithm>
const int N = 10010;
struct m{
int ti[5];
int id;
int fulls;
int sig;
int zong;
}p[N];

bool pp(m a,m b){
 if(a.zong != b.zong)
 return a.zong > b.zong;
 if(a.fulls != b.fulls)
 return a.fulls > b.fulls;
 else
 return a.id < b.id;
}

int main(){
 int pnum;
 int tnum;
 int tcnum;
 int i , j;
 int a, b, c;
 int tis[5] = {0};
 scanf("%d %d %d",&pnum,&tnum,&tcnum);
 for(i = 0;i < tnum;i++){
 scanf("%d",&tis[i]);
 }
 for(i = 0;i < N;i++){
 for(j = 0;j < 5;j++){
 p[i].ti[j] = -1;
 }
 }
 for(i = 0;i < tcnum;i++){
 scanf("%d %d %d",&a,&b,&c);
 p[a].id = a;
 if(c == tis[b-1] && p[a].ti[b-1] != tis[b-1]){
 printf("%d %d %d\n",i,p[a].id,p[a].ti[b-1]);
 p[a].fulls ++;
 }
 if(p[a].ti[b-1] <= c){
 p[a].sig = 1;
 p[a].ti[b-1] = c;
 }

 if(c == -1&&p[a].ti[b-1] == -1){
 p[a].ti[b-1] = -2;
 }
 }

 for(i = 0;i < N;i++){
 if(p[i].sig == 1){
 for(j = 0;j < tnum;j++){
 if(p[i].ti[j] == -1 || p[i].ti[j] == -2)
 p[i].zong += 0;
 else
 p[i].zong += p[i].ti[j];
 }
 }
 }
 std::sort(p,p+N,pp);
int u1 = 1;int u2 = 1;

 for(i = 0;i < N;i++){//等级排名
 if(p[i].sig == 1 && p[i].zong != 0){
 printf("%d ",u1);
 if(p[i].zong != p[i+1].zong){
 u1 = i+2;
 }


 printf("%05d %d",p[i].id,p[i].zong);
 for(j = 0;j <tnum;j++){
 if(p[i].ti[j] == -1){
 printf(" -");
 }
 else
 if(p[i].ti[j] == -2){
 printf(" 0");
 }
 else
 printf(" %d",p[i].ti[j]);
 }
 printf(" %d",p[i].fulls);
 printf("\n");
 }

 }


}

运行结果

19

 成长

 

其中实现的过程中一波三则,首先是建立了信息数组,利用编号是从1到N的整数型仿照之前写过的系数数组
// 其次是等级排序,因为之前看题时忽视了这一条件,导致再后来才看到,这里的等级排序,个人所想,较为巧妙,是利用与后一项的比较
// 最后运行时两个测试点没有通过,发现,错误原因,一个人他在提交成功,再次提交那题

发表评论

电子邮件地址不会被公开。 必填项已用*标注