(首先抱怨一下我这辣鸡翻译,硬生生的把公主分配给数字最低的王子,翻译成了选的人数最低的王子,题目又臭又长****)**
题目:
就是有n个国家和n个公主,首先公主有自己的心愿单,愿意嫁给谁,但是王子只能嫁给一个公主,每个公主嫁给王子序号数字最低的。然后自己能最多操作一次,让一个没有嫁出去的公主嫁给一个没有人要的王子,如果能操作,就打印 IMPROVE,对应的公主和王子,否则打印 OPTIMAL
思路很简单直接一个数组记忆化就过去了。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
const int N = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const unsigned long long mod = 998244353;
const int II = 3.1415926535;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int vis[n+5] = {0},ans = 0;
for(int num = 1;num <= n;num++)
{
int c,l = 0;
cin >> c;
while(c--)
{
int a;
cin >> a;
if(l)
continue;
if(!vis[a])
vis[a] = 1,l = 1;
}
if(!l)
ans = num;
}
if(ans)
{
for(int i = 1;i <= n;i++)
{
if(!vis[i])
{
cout << "IMPROVE" << endl;
cout << ans << " " << i << endl;
break;
}
}
}
else
cout << "OPTIMAL" << endl;
}
}