本题一上来最容易想到的就是暴力排序;事实上我也是这么做的。。
建立结构体
用qsort将各科成绩排一下,得到每个人的成绩排名;再择优输出即可;
但是我这里遇上了个未知Bug 编译器的输出和pta上的不一致。。导致第0个测试点过不了但是我自己编译器上却能过
这个位置用我的编译器不可能输出C的啊。。我自己调试过了的。
除此之外其他都没问题,包括诸如相同分数的两个人排名应该一致也已经考虑进去了。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct num{
char id[10];
int C,M,E;
double A;
int num_c,num_m,num_e,num_a;
};
int cmp1(const void *a,const void *b)
{
struct num *pa,*pb;
pa=(struct num*)a;
pb=(struct num*)b;
return pb->C-pa->C;
}
int cmp2(const void *a,const void *b)
{
struct num *pa,*pb;
pa=(struct num*)a;
pb=(struct num*)b;
return pb->M-pa->M;
}
int cmp3(const void *a,const void *b)
{
struct num *pa,*pb;
pa=(struct num*)a;
pb=(struct num*)b;
return pb->E-pa->E;
}
int cmp4(const void *a,const void *b)
{
struct num *pa,*pb;
pa=(struct num*)a;
pb=(struct num*)b;
return pb->A-pa->A;
}
void printS(struct num *p)
{
if(p->num_a<=p->num_c&&p->num_a<=p->num_e&&p->num_a<=p->num_m)
{
printf("%d A\n",p->num_a);
}
else if(p->num_c<=p->num_m&&p->num_c<=p->num_e&&p->num_c<p->num_a)
{
printf("%d C\n",p->num_c);
}
else if(p->num_m<p->num_c&&p->num_m<=p->num_e&&p->num_m<p->num_a)
{
printf("%d M\n",p->num_m);
}
else if(p->num_e<p->num_c&&p->num_e<p->num_m&&p->num_e<p->num_a)
{
printf("%d E\n",p->num_e);
}
}
int main()
{
int n,m,i;
char id[10];
struct num stu[2000];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s%d%d%d",&stu[i].id,&stu[i].C,&stu[i].M,&stu[i].E);
stu[i].A=(stu[i].C+stu[i].M+stu[i].E)*1.0/3; //将*1.0去掉就能AC了
}
qsort(stu,n,sizeof(stu[0]),cmp1);
for(i=0;i<n;i++)
{
stu[i].num_c=i+1; //赋予排名
if(stu[i].C==stu[i-1].C) //如果上一位同学的成绩与他一样 将他们排名一致化
stu[i].num_c=stu[i-1].num_c;
}
qsort(stu,n,sizeof(stu[0]),cmp2);
for(i=0;i<n;i++)
{
stu[i].num_m=i+1; //赋予排名
if(stu[i].M==stu[i-1].M&&i>0)
stu[i].num_m=stu[i-1].num_m;
}
qsort(stu,n,sizeof(stu[0]),cmp3);
for(i=0;i<n;i++)
{
stu[i].num_e=i+1; //赋予排名
if(stu[i].E==stu[i-1].E)
stu[i].num_e=stu[i-1].num_e;
}
qsort(stu,n,sizeof(stu[0]),cmp4);
for(i=0;i<n;i++)
{
stu[i].num_a=i+1; //赋予排名
if(stu[i].A==stu[i-1].A)
{
stu[i].num_a=stu[i-1].num_a;
}
}
int ret=0,j;
for(i=0;i<m;i++)
{
scanf("%s",&id);
for(j=0;j<n;j++)
{
if(strcmp(id,stu[j].id)==0)
{
printS(&stu[j]);
ret=1;
}
}
if(ret==0)
printf("N/A\n");
ret=0;
}
return 0;
}
经过修改(去掉一个*1.0)已经AC了。只是仍旧未知为何在pta平台上就不行。。