思路
当输入编程成绩时,只保存>=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;
}