Stay Hungry,Stay Foolish!

C - Coverage

C - Coverage

https://atcoder.jp/contests/abc289/tasks/abc289_c

 

思路

对所有组合,依此遍历

判断组合内所有的集合是否覆盖 1...n

判断过程中,如果发现某个数不能被覆盖,则说明此组合不满足要求,

如果满足要求,计数加1

Code

https://atcoder.jp/contests/abc289/submissions/38799821

#include <bits/stdc++.h>
using namespace std;
map<int,vector<int> >mp;
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int t;
        cin>>t;
        for(int j=0;j<t;j++){
            int num;
            cin>>num;
            mp[i].push_back(num);
        }
    }
    int pw2=1;
    for(int i=1;i<=m;i++){
        pw2*=2;
    }
    int ans=0;
//    cout<<pw2<<endl;
    for(int i=1;i<pw2;i++){
        vector<int>v;
        int num=i;
        for(int k=0;num>0;k++,num/=2){
            if(num%2==1){
                v.push_back(k);
//                cout<<k<<"-------"<<endl;
            }
            
        }
//        cout<<"-----------------------------------"<<endl;
        bool is=1;
        for(int j=1;j<=n;j++){
            bool ok=0;
            for(int k=0;k<v.size();k++){
                for(int l=0;l<mp[v[k]].size();l++){
                    if(mp[v[k]][l]==j){
                        ok=1;
                    }
                }
            }
            if(ok==0){
                is=0;
                break;
            }
        }
        if(is==1){
            ans++;
        }
    }
    cout<<ans<<endl;
}

 

posted @ 2023-02-11 22:23  lightsong  阅读(48)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel