PAT 甲级 1012 The Best Rank (25分)

原题链接1012 The Best Rank (25分)

题目大意:

对于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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值