PAT乙级1080 MOOC期终成绩 (25 分)

题目链接

思路

当输入编程成绩时,只保存>=200的学生信息,并对其它信息进行初始化。当输入期中和期末成绩时,首先去查找该学生的姓名是否存在,如果不存在直接跳过该学生,当存在时在进行其它操作。
一开始,查找某个学生姓名是否存在是直接用循环去vector中找,但是这样测试点3会运行超时。所以,改用map去存储学生姓名在vector中的下标,这样,当判断学生姓名是否存在,直接看map[name]是否为0。

实现

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
struct Student {
	string stuNum;
	int Gp,Gmid,Gfinal,G;	//编程成绩 期中 期末 总评
};

bool cmp(Student a, Student b)
{
	return a.G!=b.G?a.G>b.G:a.stuNum < b.stuNum;
}
int main()
{
	int P, M, N,i,temp,j,index=1;
	string stuNum;
	cin >> P >> M >> N;
	vector<Student> stus;
	map<string, int> idx;
	for (i = 0; i < P; i++)
	{
		cin >> stuNum >> temp;
		if (temp >= 200)
		{
			stus.push_back(Student{ stuNum ,temp,-1,-1,0 });
			idx[stuNum] = index++;	//比真正的下标大1
		}
			
	}
	for (i = 0; i < M; i++)
	{
		cin >> stuNum >> temp;
		if (idx[stuNum])
			stus[idx[stuNum] - 1].Gmid = temp;
	}
	for (i = 0; i < N; i++)
	{
		cin >> stuNum >> temp;
		if (idx[stuNum])
		{
			stus[idx[stuNum] - 1].Gfinal = temp;
			if (stus[idx[stuNum] - 1].Gmid > stus[idx[stuNum] - 1].Gfinal)
				stus[idx[stuNum] - 1].G = round(stus[idx[stuNum] - 1].Gmid*0.4 + stus[idx[stuNum] - 1].Gfinal*0.6);
			else
				stus[idx[stuNum] - 1].G = stus[idx[stuNum] - 1].Gfinal;
		}
	}
	sort(stus.begin(), stus.end(), cmp);
	for (i = 0; i < stus.size(); i++)
	{
		if (stus[i].G >= 60)
		{
			cout << stus[i].stuNum << " " << stus[i].Gp << " " << stus[i].Gmid << " " << stus[i].Gfinal << " " << stus[i].G << endl;	
		}	
	}
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值