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