1.题意
给出一组学生成绩,将成绩合格的排序
2.代码
- 合格的成绩:Gp>=200 ,G>=60。注意不是Gfinal。
- 输入时只需要判断Gp是否合法,其他照常输入。
- map<name,int> 存储学生name
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <cmath>
using namespace std;
const int maxn = 30010;
struct student {
string name;
int Gp = -1, GMid = -1, GFinal = -1, G;
} stu[maxn], ans[maxn];
map<string, int> name_to_int;
bool cmp(student a, student b) {
if (a.G != b.G) return a.G > b.G;
else return a.name < b.name;
}
int cnt = 0;
int get_id(string name) {
if (name_to_int.find(name) == name_to_int.end()) {
name_to_int[name] = cnt++;
}
return name_to_int[name];
}
int main() {
int n, m, p;
string name;
int score;
cin >> p >> m >> n;
for (int i = 0; i < p; ++i) {
cin.ignore();
cin >> name >> score;
if (score >= 200 && score <= 900) {
stu[get_id(name)].Gp = score;
stu[get_id(name)].name = name;
}
}
for (int i = 0; i < m; ++i) {
cin.ignore();
cin >> name >> score;
stu[get_id(name)].GMid = score;
stu[get_id(name)].name = name;
}
for (int i = 0; i < n; ++i) {
cin.ignore();
cin >> name >> score;
stu[get_id(name)].GFinal = score;
stu[get_id(name)].name = name;
}
int cnt1 = 0;
for (int i = 0; i < cnt; ++i) {
if (stu[i].Gp != -1 && stu[i].GFinal != -1) {
if (stu[i].GMid > stu[i].GFinal) {
stu[i].G = round(stu[i].GMid * 0.4 + stu[i].GFinal * 0.6);
if (stu[i].G >= 60) ans[cnt1++] = stu[i];
} else if (stu[i].GFinal >= 60) {
stu[i].G = stu[i].GFinal;
ans[cnt1++] = stu[i];
}
}
}
sort(ans, ans + cnt1, cmp);
for (int i = 0; i < cnt1; ++i) {
printf("%s %d %d %d %d\n", ans[i].name.c_str(), ans[i].Gp, ans[i].GMid, ans[i].GFinal, ans[i].G);
}
return 0;
}