2024年PAT乙级春季考试 B-5AI评语 分数:25分 题型:大模拟

142 阅读2分钟

image.png

对于PTA(包括天梯赛、睿抗、PAT等等)中常考的描述文字和要求较多的问题,我们拆分成多个问题,分别求解,对于姓名和五个数字的匹配,我们用map来储存(进而可以直接用map判断考生是否存在),用结构体来存这五个数字。

求解每组数的中位数,与考生姓名无关,我们用5个vector来存储这五个类别的数字,排序后得到中位数。

对于每个查询考生的输出,我们可以再用一个结构体来存差值,用cmp重载排序,按着题目格式进行输出。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
map<string, int>mp;      //存放id的下标
vector<int>q[6];         //存放6种测试能力
int va, vb, vc, vd, ve;  //存放五个等级的中位数

struct ONE
{
	int a, b, c, d, e;
}p[N];
struct CMP
{
	int id;
	int val;
}v[6];

//按照值降序排 如果值相同,按照id升序排
bool cmp(CMP a, CMP b)
{
	if (a.val != b.val)return a.val > b.val;
	return a.id < b.id;
}

int main()
{
	 cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		string id; cin >> id;
		int a, b, c, d, e; cin >> a >> b >> c >> d >> e;
		q[0].push_back(a); q[1].push_back(b); q[2].push_back(c); q[3].push_back(d); q[4].push_back(e);

		//找一下每个数的中位数
		mp[id] = i;
		p[i] = { a,b,c,d,e };
	}

	sort(q[0].begin(), q[0].end()), sort(q[1].begin(), q[1].end()), sort(q[2].begin(), q[2].end()), sort(q[3].begin(), q[3].end()), sort(q[4].begin(), q[4].end());
	va = q[0][n / 2], vb = q[1][n / 2], vc = q[2][n / 2], vd = q[3][n / 2], ve = q[4][n / 2];


	while (m--)
	{
		string queryid; cin >> queryid;
		if (!mp.count(queryid)) cout << "Not Found" << endl;
		else
		{
			//判断一下是否大于中位值
			int u = mp[queryid];
			v[1].id = 1, v[1].val = p[u].a - va;
			v[2].id = 2, v[2].val = p[u].b - vb;
			v[3].id = 3, v[3].val = p[u].c - vc;
			v[4].id = 4, v[4].val = p[u].d - vd;
			v[5].id = 5, v[5].val = p[u].e - ve;

			sort(v + 1, v + 6, cmp);

			vector<int>res;  //存放答案
			for (int i = 1; i <= 5; i++)
			{
				if (v[i].val >= 0)res.push_back(v[i].id);
				else res.push_back(-v[i].id);
				
			}

			//输出  末尾不得有空格 
			for (int i = 0; i < 5; i++)
			{
				if (i != 4)cout << res[i] << " ";
				else cout << res[i] << endl;
			}
		}
	}

	return 0;
}