PAT-B 1080 MOOC期终成绩 (25分)

对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分(满分100)。总评成绩的计算公式为 G=(G
​mid−term
​​ ×40%+G
​final
​​ ×60%),如果 G
​mid−term
​​ >G
​final
​​ ;否则总评 G 就是 G
​final
​​ 。这里 G
​mid−term
​​ 和 G
​final
​​ 分别为学生的期中和期末成绩。

现在的问题是,每次考试都产生一张独立的成绩单。本题就请你编写程序,把不同的成绩单合为一张。

输入格式:
输入在第一行给出3个整数,分别是 P(做了在线编程作业的学生数)、M(参加了期中考试的学生数)、N(参加了期末考试的学生数)。每个数都不超过10000。

接下来有三块输入。第一块包含 P 个在线编程成绩 G
​p
​​ ;第二块包含 M 个期中考试成绩 G
​mid−term
​​ ;第三块包含 N 个期末考试成绩 G
​final
​​ 。每个成绩占一行,格式为:学生学号 分数。其中学生学号为不超过20个字符的英文字母和数字;分数是非负整数(编程总分最高为900分,期中和期末的最高分为100分)。

输出格式:
打印出获得合格证书的学生名单。每个学生占一行,格式为:

学生学号 G
​p
​​ G
​mid−term
​​ G
​final
​​ G

如果有的成绩不存在(例如某人没参加期中考试),则在相应的位置输出“−1”。输出顺序为按照总评分数(四舍五入精确到整数)递减。若有并列,则按学号递增。题目保证学号没有重复,且至少存在1个合格的学生。

输入样例:
6 6 7
01234 880
a1903 199
ydjh2 200
wehu8 300
dx86w 220
missing 400
ydhfu77 99
wehu8 55
ydjh2 98
dx86w 88
a1903 86
01234 39
ydhfu77 88
a1903 66
01234 58
wehu8 84
ydjh2 82
missing 99
dx86w 81

输出样例:
missing 400 -1 99 99
ydjh2 200 98 82 88
dx86w 220 88 81 84
wehu8 300 55 84 84

作者: CHEN, Yue
单位: 浙江大学
时间限制: 200 ms
内存限制: 64 MB

本题需要注意的是:如果利用vector来操作的话,就会花费一定的时间去进行查找操作,所以为了减少查找操作,所以可以利用map,不过本人写的时候稍微麻烦了一点,,,,,不过最后也是很险的通过了,直接上代吗吧。。。

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
using namespace std;

struct stu{
	string name;
	int gp;//编程分数
	int gm;//期中成绩
	int gf;//期末成绩
	int g;//总评成绩 
	stu(){
		gp=-1;
		gm=-1;
		gf=-1;
		g=-1; 
	} 
};

bool CMP_1(stu a,stu b){
	if(a.g>b.g) return true;
	else if(a.g==b.g){
		//总评相同
		return a.name<b.name; 
	}
	return false;
}

int main(){
	int p,m,n;
	vector<stu> v;
	map<string, stu > M;//使用map减少搜索操作 
	set<string> S;
	cin >> p>>m>>n;
	//编程分数 
	for(int i=0;i<p;i++){
		string name;
		int gp;
		cin >> name>>gp; 
		if(gp>=200){
			stu s;
			s.name=name;
			s.gp=gp;
			M[name]=s;
			S.insert(name);
		}
	}
	
	//期中成绩
	for(int i=0;i<m;i++){
		string name;
		int gm;
		cin >> name>> gm;
		M[name].gm=gm;
	} 
	
	//期末成绩
	for(int i=0;i<n;i++){
		string name;
		int gf;
		cin >> name>>gf;
		M[name].gf=gf;
	} 
	
	//将map中的数据迁移到vector中 
	set<string>::iterator i;
	for(i=S.begin();i!=S.end();i++){
		string name=*i;
		stu s=M[name];
		v.push_back(s);
	}
	
	
	//计算总评成绩
	vector<stu>::iterator ite;
	for(ite=v.begin();ite!=v.end();ite++){
		if(ite->gm > ite->gf){
			//期中成绩大于期末成绩
			ite->g = (ite->gm*4.0/10+ite->gf*6.0/10)+0.5; 
		}else{
			ite->g=ite->gf;
		}
	} 
	
	//安宗平分数递减
	sort(v.begin(),v.end(),CMP_1); 
	
	//输出
	for(ite=v.begin();ite!=v.end();ite++){
		if(ite->g>=60){
			printf("%s %d %d %d %d\n",ite->name.c_str(),ite->gp,ite->gm,ite->gf,ite->g);
//			cout<<ite->name<<" "<<ite->gp<<" "<<ite->gm<<" "
//				<<ite->gf<<" "<<ite->g<<endl;
		}
	} 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ARM微控制器和嵌入式系统是两个密切相关的概念。ARM微控制器是一种基于ARM架构的微处理器,常用于嵌入式系统中。嵌入式系统是一种被嵌入在其他设备中的计算机系统,用于控制和管理该设备的各种功能。 ARM微控制器是一种非常常见的微处理器架构,具有低功耗、高性能和高可靠性的特点。它被广泛用于各种嵌入式应用中,比如智能手机、平板电脑、家用电器等。ARM架构具有良好的兼容性,可以支持不同的软件开发工具和操作系统,如Android、Linux等。 嵌入式系统是一种专门设计用于控制和管理设备的计算机系统。它通常由硬件和软件两部组成,硬件部包括处理器、存储器、输入输出接口等,软件部包括操作系统和应用程序。嵌入式系统通常需要满足一些特定需求,如实时性、低功耗、小体积等。 在嵌入式系统中,ARM微控制器被广泛应用。它具有丰富的外围接口和强大的计算能力,可以满足各种设备的控制和管理需求。ARM微控制器的软硬件资源丰富,可供开发人员进行灵活的开发和定制。同时,ARM的生态系统也非常完善,有各种开发工具和支持资源可供选择。 清华MOOC是清华大学开设的在线教育平台,其中也有关于ARM微控制器和嵌入式系统的相关课程。通过学习清华MOOC中的课程,可以深入了解ARM微控制器和嵌入式系统的原理和应用,掌握相应的开发技能。这对于希望从事嵌入式系统开发的人而言,是一种很好的学习资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴同学GOGOGO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值