[语言月赛202211] BAN-PICK
题目描述
在第五人格职业联赛的每一场对局中,需要进行 Ban-Pick 流程。Ban 即角色禁用,Pick 即角色选用。
如试题 Winner 所述,游戏分为 求生者( Survivor \texttt{Survivor} Survivor) 与 监管者( Hunter \texttt {Hunter} Hunter) 两个阵营。求生者阵营 共有 n n n 名角色,监管者阵营 共有 m m m 名角色。
在某局比赛中,监管者 可以 ban(禁用) 掉 求生者阵营 5 5 5 名角色,求生者 可以 ban(禁用) 掉 监管者阵营 2 2 2 名角色。
每个角色,无论其属于求生者阵营还是监管者阵营,均可以使用 熟练度 来量化该阵营选手选择该角色的优先程度。选手一定会优先选择 熟练度 更高的角色进行游戏。
基于这样的考量,监管者选手 在进行 Ban 流程时,往往会选择 ban(禁用) 掉 求生者阵营熟练度最高 的若干名 求生者角色。同样,求生者选手 在进行 Ban 流程时,往往会选择 ban(禁用) 掉 监管者阵营熟练度最高 的若干名 监管者角色。
在 Ban 流程完成后,需要执行 Pick 流程。
如试题 Winner 所述,求生者选手 需要从 求生者阵营 中选择 4 4 4 名不同的角色,监管者选手 需要从 监管者阵营 中选择 1 1 1 名角色。
现在告诉你所有角色的名字、阵营与选手对其熟练度,请你给出双方阵营 Pick 的角色名字。
输入格式
输入共 n + m + 1 n+m+1 n+m+1 行。
输入的第一行为两个整数 n , m n,m n,m,分别代表求生者阵营角色数和监管者阵营角色数。
接下来
n
+
m
n+m
n+m 行,首先为一个仅由英文字母组成的字符串,代表该角色的姓名;接下来为一个大写字符 H
或 S
,若为 H
,则代表该角色为监管者阵营,若为 S
,则代表该角色为求生者阵营;接下来一个正整数,代表该阵营选手对该角色的熟练度。上述字符串、大写字符、正整数之间由一个空格分隔。
输出格式
输出共 5 5 5 行。
输出的第一行为监管者阵营选择角色的角色名。
输出的第二到五行为求生者阵营选择角色的角色名,按照熟练度从高到低排列。
样例 #1
样例输入 #1
9 3
Amily S 1
Lydia S 2
Lisa S 4
Beck H 1
Freddie S 5
Cliche S 6
Aesop S 7
Eli S 8
Norton S 9
Tiletower H 3
Yidhra H 2
Emma S 3
样例输出 #1
Beck
Lisa
Emma
Lydia
Amily
提示
输入输出样例 1 解释
求生者阵营角色: Amily,Lydia,Lisa,Freddie,Cliche,Aesop,Eli,Norton,Emma \texttt{Amily,Lydia,Lisa,Freddie,Cliche,Aesop,Eli,Norton,Emma} Amily,Lydia,Lisa,Freddie,Cliche,Aesop,Eli,Norton,Emma。
监管者阵营角色: Beck,Tiletower,Yidhra \texttt{Beck,Tiletower,Yidhra} Beck,Tiletower,Yidhra。
监管者选手将 ban 掉求生者阵营中角色 Norton,Eli,Aesop,Cliche,Freddie \texttt{Norton,Eli,Aesop,Cliche,Freddie} Norton,Eli,Aesop,Cliche,Freddie。
求生者选手将 ban 掉监管者阵营中角色 Tiletower,Yidhra \texttt{Tiletower,Yidhra} Tiletower,Yidhra。
数据规模与约定
对于前 20 % 20\% 20% 的数据, n = 9 , m = 3 n = 9, m = 3 n=9,m=3。
对于前 50 % 50\% 50% 的数据,保证 n ≤ 1 0 3 , m ≤ 1 0 3 n \leq 10 ^ 3, m \leq 10 ^3 n≤103,m≤103。
对于前 70 % 70\% 70% 的数据,保证 w i ≤ 1 0 9 w _ i \leq 10 ^ 9 wi≤109。
对于所有数据,保证 9 ≤ n ≤ 1 0 5 , 3 ≤ m ≤ 1 0 5 9 \leq n \leq 10 ^ 5, 3 \leq m \leq 10 ^ 5 9≤n≤105,3≤m≤105,所有名字长度 ≤ 10 \leq 10 ≤10。熟练度大小 w i w _ i wi 满足 1 ≤ w i ≤ 1 0 18 1 \leq w _ i \leq 10 ^ {18} 1≤wi≤1018。保证每个阵营中熟练度互不相同。保证名字仅有大写字母和小写字母构成。
思路:
定义两个结构体,一个存求生者一个存监管者,对他们按照熟练度降序排序,监管者ban了两个,监管者数组前两个不取,同理求生者数组一样。
#include<bits/stdc++.h>
using namespace std;
struct node{
string name;
long long n;
} arr[100005],arr2[100005];
int n,m;
bool cmp(node a,node b){
return a.n > b.n;
}
int main(){
int n,m, h = 0, s1 = 0;
cin >> n >> m;
string s;
long long ns;
char c;
for(int i = 1; i <= n + m; i++){
cin >> s >> c >> ns;
if(c == 'H'){
h++;
arr2[h].name = s;
arr2[h].n = ns;
} else {
s1++;
arr[s1].name = s;
arr[s1].n = ns;
}
}
sort(arr + 1, arr+s1+1, cmp);
sort(arr2 + 1, arr2+h + 1, cmp);
cout << arr2[3].name << "\n";
for(int i = 6; i <= 9; i++)
cout << arr[i].name << "\n";
return 0;
}