题目大意:
对于CS专业的学生,我们要对他们进行一个评估,向学生展示他们最好的某一科和排名。 给n个学生的成绩和m次询问。学生成绩按照C/M/E的顺序给出来,除了这三个我们还要计算一下学生的平均成绩。
每次询问输入学生id,你输出这个学生最好的一科,如果多科一样好,按照A/C/M/E的优先级
分析:
A > C > M > E
思路:用哈希map存学生
key为学生唯一id,value为vector存的四个成绩值:A C M E
vector q 长度为4,四个q[i]分别存所有人的A\C\M\E成绩 并按升序排列 方便后继二分查找位置
分析:读入,对q排序,对每个人的四课成绩二分查找rank
1.round()函数 四舍五入
2.unordered_map/map 中的count都是查找key,因为主键才是唯一的,value有那么多重复的呢
满分代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
// key为存储顺序,value为vector 存每个人的四科成绩
unordered_map<string, vector<int>> grades;
// 四个q分别存放所有人的A/C/M/E成绩
vector<int> q[4];
// 在每一个q中二分查找该分数的排名
int get_rank(vector<int> a, int k) {
int l = 0, r = a.size() - 1;
while(l < r) {
int mid = (l + r + 1) >> 1;
if(a[mid] <= k) l = mid;
else r = mid - 1;
}
return a.size() - l;
}
int main() {
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++) {
string id;
int t[4] = {0};
cin >> id;
for(int j = 1; j < 4; j++) {
cin >> t[j];
t[0] += t[j];
}
t[0] = round(t[0] / 3.0);
for(int j = 0; j < 4; j++) {
// A C M E
grades[id].push_back(t[j]);
q[j].push_back(t[j]);
}
}
// 对四个vector q进行升序排列
for(int i = 0; i < 4; i++) sort(q[i].begin(), q[i].end());
// 每行输出
char s[] = "ACME";
while(m--) {
string id;
cin >> id;
if(grades.count(id) == 0) puts("N/A");
// 将id的四门成绩在q数组中二分,以查找rank
else {
int maxans = n+1;
char c;
for(int i = 0; i < 4; i++) {
int rank = get_rank(q[i], grades[id][i]);
if(rank < maxans) {
// 拿到排名和i课的对应字母
maxans = rank;
c = s[i];
}
}
cout << maxans << " " << c << endl;
}
}
return 0;
}