思路:创建一个结构体数组,储存学生的所有信息;每次输入成绩时,首先查找该学生,然后判断该学生是否可能获得证书;再进行排序,然后输出。有两个测试点未通过,超时了,主要是因为查找学生是比较耗时,O(n*n)。分数为16。
#include<stdio.h> //16
#include<string.h>
#include<stdlib.h>
struct student{
char sid[20];
int pro;
int mid;
int fin;
int ggg;
};
int cmp(const void *a,const void *b)
{
struct student s1=*(struct student *)a;
struct student s2=*(struct student *)b;
if(s1.ggg!=s2.ggg)return s2.ggg-s1.ggg;
else return strcmp(s1.sid,s2.sid);
}
int main()
{
int p,m,n,sn;
sn=0;
struct student st[10000];
scanf("%d %d %d",&p,&m,&n);
//getchar();
int i;
for(i=0;i<p;i++) //输入编程成绩
{
char a[20];
int b;
scanf("%s %d",a,&b);
//getchar();
if(b>=200) //编程成绩大于200,可能满足要求,录入id和编程成绩Pro
{
st[sn].pro=b;
st[sn].mid=-1;
st[sn].fin=-1;
st[sn].ggg=-1;
strcat(st[sn].sid,a);
sn++;
}
}
for(i=0;i<m;i++) //输入中期成绩mid
{
char a[20]={""};
int b;
scanf("%s %d",a,&b);
//getchar();
int j;
for(j=0;j<sn;j++)
{
if(strcmp(st[j].sid,a)==0) //输入该同学的中期成绩
{
st[j].mid=b;
break;
}
}
}
for(i=0;i<n;i++) //输入期末成绩 fin
{
char a[20]={""};
int b;
scanf("%s %d",a,&b);
//getchar();
if(b>=34) //期末成绩大于33.333 !!!!!!!!!
{
int j;
for(j=0;j<sn;j++)
{
if(strcmp(st[j].sid,a)==0) //输入该同学期末成绩
{
if(b<st[j].mid) //mid>fin
{
int g;
g=(int)(b*0.6+st[j].mid*0.4+0.5);
st[j].fin=b;
st[j].ggg=g;
}
else
{
st[j].fin=b;
st[j].ggg=b;
}
break;
}
}
}
}
qsort(st,sn,sizeof(st[0]),cmp);
for(i=0;i<sn;i++)
if(st[i].ggg>=60)printf("%s %d %d %d %d\n",st[i].sid,st[i].pro,st[i].mid,st[i].fin,st[i].ggg);
return 0;
}