题目链接
题意:给n个公主和王子,分别标号
1
,
2
,
3
,
.
.
.
,
n
1,2,3,...,n
1,2,3,...,n,每个公主有一个心仪的王子列表,所有公主按顺序进行匹配,并且对于每一位公主也按照自己心仪列表从前往后匹配王子,如果没匹配到就不结婚。现在你可以在匹配开始之前说服某一位公主添加一个王子进入心仪列表(包办QAQ),问你最终匹配成功的数量。
思路:直接按题意模拟。由于当前最多匹配完成
n
n
n对,所以如果可以直接匹配成功
n
n
n对,就无需操作,如果能够匹配成功不足
n
n
n对,由于是一对一匹配,所以对于某一个未匹配的公主,必然至少有一个未匹配的王子,只要把这个王子添加到公主的心仪序列即可。
#include <bits/stdc++.h>
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define N 100005
#define fo(i, a, b) for(i=a;i<=b;i++)
#define fd(i, a, b) for(i=a;i>=b;i--)
using namespace std;
int T = 1;
bool dau[N],king[N];
int n;
int main() {
cin >> T;
while (T--) {
cin>>n;
memset(dau,false,sizeof(dau));
memset(king,false,sizeof(king));
vector<vector<int>> dk(n+1);
for(int i=0;i<n;i++){
int x,k;
cin>>x;
for(int j=0;j<x;j++){
cin>>k;
dk[i].push_back(k);
}
}
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<dk[i].size();j++){
if(!king[dk[i][j]]){
dau[i+1]=king[dk[i][j]]=true;
cnt++;
break;
}
}
}
if(cnt<n){
int d,k;
for(int i=1;i<=n;i++) if(!dau[i]) {
d=i;
break;
}
for(int i=1;i<=n;i++) if(!king[i]) {
k=i;
break;
}
cout<<"IMPROVE\n"<<d<<' '<<k<<"\n";
}
else cout<<"OPTIMAL\n";
}
return 0;
}