PAT1080 MOOC期终成绩

题目链接:请点击
分析:
注1:测试点3易超时,不能每次都从结构体头开始逐一比较学号是否存在。所以,用map下标标识学号,里面存储该学号学生所在结构体的编号。
注2:计算总评需要四舍五入
AC代码

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
struct Stu{
	string id;//学号 
	int gp=-1;//在线编程成绩 
	int gm=-1;//期中成绩 
	int gf=-1;//期末成绩 
	int g;//总评成绩 
}; 
bool cmp(Stu stua,Stu stub){
	if(stua.g!=stub.g) return stua.g>stub.g;
	else return stua.id<stub.id;
}
int main(){
	int P,M,N,k=0;
	cin>>P>>M>>N;
	Stu stu[P];
	map<string,int> stuId;//下标对应学生学号
	for(int i=0;i<P;i++){
		string sid;int grade;
		cin>>sid>>grade;
		if(grade>=200){//编程成绩>=200 
			stuId[sid]=k+1;//标识sid学生存在且编程合格 
			stu[k].id=sid;
			stu[k].gp=grade;
			k++; 
		}
	}
	for(int i=0;i<M;i++){
		int grade;string sid;
		cin>>sid>>grade;
		if(stuId[sid]) stu[stuId[sid]-1].gm=grade;
	}
	for(int i=0;i<N;i++){
		int grade;string sid;
		cin>>sid>>grade;
		if(stuId[sid]) stu[stuId[sid]-1].gf=grade;
	}
	for(int i=0;i<k;i++){
		if(stu[i].gm>stu[i].gf){//期中>期末 注意四舍五入
			float grade=1.0*stu[i].gm*0.4+1.0*stu[i].gf*0.6;
			if(grade-(int)grade>=0.5) stu[i].g=(int)grade+1;
			else stu[i].g=(int)grade;
		} else stu[i].g=stu[i].gf;
		if(stu[i].g<60) stu[i].g=-1;
	}
	sort(stu,stu+k,cmp);
	for(int i=0;i<k;i++){
		if(stu[i].g==-1) return 0;
		cout<<stu[i].id<<" "<<stu[i].gp<<" "<<stu[i].gm<<" "<<stu[i].gf<<" "<<stu[i].g<<endl; 
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值