Educational Codeforces Round 84 (Rated for Div. 2) B. Princesses and Princes

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;
}

发布了175 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/105076315