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; }
出处:http://www.cnblogs.com/lightsong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。