#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void*a,const void*b);
int compare(const void*a,const void*b);
struct xinxi{
char a[21];
int b;
int c;
int d;
int e;
};
int main(){
int p,mid,final;
scanf("%d %d %d",&p,&mid,&final);
int i=0;
struct xinxi student[30000];
for(i=0;i<30000;i++){
student[i].b=0;
student[i].c=0;
student[i].d=0;
}
int cnt=0;
i=0;
char n[21];
int m=0;
while(i<p){
scanf("%s %d",n,&m);
if(m>=200){student[cnt].b=m;
strcpy(student[cnt++].a,n);}
i++;}
i=0;
int t=0;
int flag=0;
while(i<mid){
scanf("%s %d",n,&m);
student[cnt].c=m;
strcpy(student[cnt++].a,n);
i++;
}
i=0;
while(i<final){
scanf("%s %d",n,&m);
student[cnt].d=m;
strcpy(student[cnt++].a,n);
i++;
}
qsort(student,cnt,sizeof(struct xinxi),compare);//收集完所有数据后,按学号升序排列,那么相同学号的就会排列到一起。
int cnt2=0;struct xinxi s[cnt];
for(i=0;i<cnt;i++){//判断前后结构体中的学号是否相同,相同则叠加(最多叠加3个),然后跳到下一个新的结构体
s[cnt2]=student[i];
if(i+1<cnt&&strcmp(student[i].a,student[i+1].a)==0){
s[cnt2].b+=student[i+1].b;
s[cnt2].c+=student[i+1].c;
s[cnt2].d+=student[i+1].d;
if(i+2<cnt&&strcmp(student[i+1].a,student[i+2].a)==0){
s[cnt2].b+=student[i+2].b;
s[cnt2].c+=student[i+2].c;
s[cnt2].d+=student[i+2].d;
i++;
}
i++;
}
cnt2++;
}
int n1=0;struct xinxi s2[cnt2];
for(i=0;i<cnt2;i++){
if(s[i].c>s[i].d){
s[i].e=0.4*s[i].c+0.6*s[i].d+0.5;
}else{
s[i].e=s[i].d;
}
if(s[i].c==0){s[i].c=-1;}
if(s[i].b>=200&&s[i].e>=60){
s2[n1++]=s[i];
}
}
qsort(s2,n1,sizeof(struct xinxi),cmp);
for(i=0;i<n1;i++){
printf("%s %d %d %d %d\n",s2[i].a,s2[i].b,s2[i].c,s2[i].d,s2[i].e);
}
return 0;
}
int cmp(const void*a,const void*b){
if(((const struct xinxi*)b)->e-((const struct xinxi*)a)->e){
return ((const struct xinxi*)b)->e-((const struct xinxi*)a)->e;
}
return strcmp(((const struct xinxi*)a)->a,((const struct xinxi*)b)->a);
}
int compare(const void*a,const void*b){
return strcmp(((const struct xinxi*)a)->a,((const struct xinxi*)b)->a);
}
对第四个测试点来说,并没有超时,显示答案错误。我搜索了网上其他人的做法,他们用了bsearch做查找,我试过了也通过了。但是,总是很疑惑我的方法到底错在哪里,反复检查我的代码,找不出问题所在,因此想请教各位编程大神。
ps:代码略长,不过关键就在于注释部分。