B. Princesses and Princes
题目链接-B. Princesses and Princes
题目大意
国王有n个女儿,他想把他的女儿嫁给n个王国的王子。因此,他从1到n列举了他的女儿,从1到n列举了王国。他为每个女儿编制了一份她想嫁给的王国王子的名单。对于每一个女儿,她会嫁给她名单中数字最低的王国,如果名单中没有自由的王子,那么女儿就不嫁给任何人。在开始结婚之前,他可以在他女儿的名单中恰好添加一个王国以增加配对的数量。如果没有办法增加配对的总数,那么输出OPTIMAL,如果有多种方法使配对总数增加,则可以打印其中任何一种
解题思路
模拟+贪心
先按照读进来的顺序找到每个公主匹配的王子,如果全部匹配,就输出OPTIMAL,否则找出一个未匹配的公主和未匹配的王子,将这个王子加入公主的名单输出即可
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
#define endl '\n'
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
set<int> vis;
while(t--){
int n;
vis.clear();
cin>>n;
int who=-1;
for(int i=1;i<=n;i++){
int k;
cin>>k;
bool flag=0;
while(k--){
int tmp;
cin>>tmp;
if(!flag&&!vis.count(tmp)){
flag=1;
vis.insert(tmp);
}
}
if(!flag&&who==-1)
ass=i;
}
bool ass=1;
for(int i=1;i<=n;i++){
if(!vis.count(i)){
cout<<"IMPROVE"<<endl;
cout<<who<<" "<<i<<endl;
ass=0;
break;
}
}
if(ass)
cout<<"OPTIMAL"<<endl;
}
return 0;
}