CF-Educational Codeforces Round 84 (Rated for Div. 2)-1327B. Princesses and Princes【模拟】

题目链接
题意:给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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值