1080. MOOC期终成绩 (25)

思路:创建一个结构体数组,储存学生的所有信息;每次输入成绩时,首先查找该学生,然后判断该学生是否可能获得证书;再进行排序,然后输出。有两个测试点未通过,超时了,主要是因为查找学生是比较耗时,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值