题意
小A将度过m天假期
他有n个朋友
每天 其中有k个朋友有空
他会和其中一个玩
但是和同一个人玩的天数超过(m+1)/2
会令其他朋友不满
安排一种情况使得其没人不满
如果可以 输出YES和每天小A和谁玩
如果不可以输出NO
思路
每天令出现的第一个先上
找一个出现超过(m+1)/2次的朋友vis
如果没有就YES
有的话
后面再遍历
使有vis和其他朋友出现的那天让其他朋友上
vis的出现次数–
直到<=(m+1)/2
AC代码
#include <bits/stdc++.h>
#define endl "\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
const double PI = acos(-1.0);
const double EI = exp(1.0);
const int N = 1e5 + 10;
const double eps = 1e-8;
vector<int>v[N];
int a[N];
void solve()
{
int n, m;
map<int, int>mp;
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int k;
cin >> k;
v[i].clear();
while (k--)
{
int x;
cin >> x;
v[i].push_back(x);
}
a[i] = v[i][0];
}
int flag = 0, vis = 0;
for (int i = 1; i <= m; i++)
{
mp[a[i]]++;
if (mp[a[i]] > (m + 1) / 2)
{
flag = mp[a[i]];
vis = a[i];
}
}
if (flag > (m + 1) / 2)
{
for (int i = 1; i <= m; i++)
{
if (v[i].size() > 1 && v[i][0] == vis)
{
a[i] = v[i][1];
flag--;
}
if (flag <= (m) / 2)
break;
}
}
if (flag > (m + 1) / 2)
cout << "NO" << endl;
else
{
cout << "YES" << endl;
for (int i = 1; i <= m; i++)
{
cout << a[i] <<" ";
}
cout << endl;
}
mp.clear();
for (int i = 1; i <= m; i++)
a[i] = 0;
}
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin >> t; while (t--)
solve();
return 0;
}````