1075 PAT Judge (25 分)
心思在缜密一点就好了。
题意
给出一组数,代表某位选手提交代码记录。
选手id 题目id 得分情况
对选手进行排名,优先级:分数 > ac题目数 > id字典序,并输出他们的分数,以及对应题目的得分数。
没有得分的选手不参与排名,编译没过的题为0分,没提交过的题用“-”表示。
思路
结构体数组把信息存下,对结构体进行排序。
注意:
相同得分选手的名次相同,提交且编译没有的题记为0分,没提交过的题记为“-”。多次提交取最高分。
代码
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct node{
int solv=0,val=0,gre[6]={-1,-1,-1,-1,-1,-1},vis=0,num;
}node;
node number[100007];
bool cmp(node a,node b)
{
if(a.vis==b.vis){
if(a.val==b.val){
if(a.solv==b.solv){
return a.num<b.num;
}else{
return a.solv>b.solv;
}
}else{
return a.val>b.val;
}
}else{
return a.vis>b.vis;
}
}
//int vis[10007];
int main()
{
int n,k,m,pre[6],x,y,z;
// memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++){
scanf("%d",&pre[i]);
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&z);
number[x].num=x;
if(z==-1){
if(number[x].gre[y]==-1){ //最后一个测试点。注意这里如果之前有得分的话不会得0
number[x].gre[y]=0;
}
continue;
}
number[x].vis=1;
if(number[x].gre[y]<z){
if(number[x].gre[y]!=-1){
number[x].val+=z-number[x].gre[y];
}else{
number[x].val+=z;
}
number[x].gre[y]=z;
if(z==pre[y]){
number[x].solv++;
}
}
}
int lev=1,mi;
sort(number,number+2+n,cmp);
for(int i=0;i<n+2;i++){
if(number[i].vis==0){
// printf("@\n");
break;
}
// printf("#\n");
if(i!=0){
if(mi==number[i].val){
printf("%d ",lev);
}else{
printf("%d ",i+1);
lev=i+1;
mi=number[i].val; //记录第一名的得分,便于与第二人比较
}
}else{
printf("%d ",lev);
mi=number[i].val;
}
printf("%05d %d",number[i].num,number[i].val);
for(int j=1;j<=k;j++){
if(number[i].gre[j]==-1){
printf(" -");
}else{
printf(" %d",number[i].gre[j]);
}
}
printf("\n");
}
return 0;
}