C. Basic Diplomacy (思维)
这一题首先要搞明白 NO 的情况,就只有当每一次只能选一个人的时候选的那个人的次数超过了(m + 1) / 2,这种情况才会出现 NO,所以要先将k == 1的人出现的次数记录一下。
排除了 NO 的情况就只剩下 YES ,当 k == 1时,就只能输出那个人,而其他情况就需要选择当前被选次数最少的人,并将其记录。
#include <bits/stdc++.h>
using namespace std;
int a[100005];
vector<int> vt[100005];
int main(){
int t;
cin >> t;
while(t--){
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++)
vt[i].clear();
memset(a, 0, sizeof(a));
int f = 0;
for (int i = 1; i <= m; i++){
int k;
cin >> k;
for (int j = 1; j <= k; j++){
int x;
cin >> x;
vt[i].push_back(x);
}
if(k == 1)
a[vt[i][0]]++;
if(a[vt[i][0]] > (m + 1) / 2)
f = 1;
}
if(f == 1){
cout << "NO" << endl;
continue;
}
cout << "YES" << endl;
for (int i = 1; i <= m; i++){
if(vt[i].size() == 1){
cout << vt[i][0] << " ";
continue;
}
int maxx = vt[i][0];
for (int j = 1; j < vt[i].size(); j++){
if(a[vt[i][j]] < a[maxx]){
maxx = vt[i][j];
}
}
cout << maxx << " ";
a[maxx]++;
}
cout << endl;
}
return 0;
}