题目链接: https://hpuoj.com/contest/7/problem/D/
D. 疯狂精灵球
单点时限: 2.0 sec
内存限制: 512 MB
QAQ所在的学校今天正在再举办“疯狂精灵球”比赛,正在犹豫要不要参加时......
耳边突然响起了:
没有勇气开始的时候,其实已经结束了——HJL大佬的话,于是QAQ也鼓起勇气决定参赛,梦想还是要有的,万一当分母了呢..
…呸呸....万一获奖了呢
QAQ——现在拥有N个精灵球编号,每个精灵球里沉睡着一只战力为A的口袋怪兽。
战力相同的口袋怪兽属于同一种类,为了提升它们的实战经验QAQ安排了M场对局,每场对局由编号为X和Y的精灵球里的口袋怪兽进行对战,由于同一种类的口袋怪兽彼此之间共享实战经验,因此每和其他种类的口袋怪兽战斗一次,该种类所有的口袋怪兽的实战经验值都会加 1。
对于已经经历过对战的两种口袋怪兽由于它们已经互相熟悉对方的技能,再次对战便不会增加实战经验值,同一种类的口袋怪兽由于关系亲密即使被分配到一起也不会进行战斗。
输入格式
有T组测试数据。
对于每组数据第一行输入精灵球的个数 N 和 对局场数 M
第二行输入每个精灵球里沉睡的口袋怪兽的战力值A
接下来 M 行输入每场对局的精灵球编号 X和Y
0<T<40
2≤N≤100000,1≤M≤100000
1≤A≤100000
1≤X,Y≤N,X≠Y
输出格式
QAQ想从中挑出实战经验最丰富的的一个种类的口袋怪兽去参赛,对于实战经验一样的口袋怪兽,QAQ希望它能取得的好名次的可能性尽可能的大,每组输出占一行。
样例
input
3 3 2 1 2 3 1 2 1 3 3 2 2 3 5 1 2 3 1 2 2 3 4 1 2 1 2
output
1 2 4
思路:注意:“该种类所有的口袋怪兽的实战经验值都会加 1” 及 “已经经历过对战的两种口袋怪兽由于它们已经互相熟悉对方的技能,再次对战便不会增加实战经验值”;
用set对已经进行过的战斗进行去重。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
set <int> s[MAXN];
int power[MAXN];
int main()
{
int T;
cin>>T;
for(int t=0; t<T; t++)
{
for(int i=1; i<MAXN; i++)
s[i].clear();
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>power[i];
int a,b;
for(int i=0; i<m; i++)
{
cin>>a>>b;
if(power[a] != power[b])
{
s[power[a]].insert(power[b]);
s[power[b]].insert(power[a]);
}
}
int ans = power[1];
for(int i=2; i<=n; i++)
{
if(s[ans].size() < s[power[i]].size())
ans = power[i];
else if(s[ans].size() == s[power[i]].size() && ans < power[i])
ans = power[i];
}
cout<<ans<<endl;
}
return 0;
}
//3
//3 2
//1 2 3
//1 2
//1 3
//3 2
//2 3 5
//1 2
//3 1
//2 2
//3 4
//1 2
//1 2