Atcoder Beginner Contest 147C(状态压缩)

最多15个人,用N个二进制的数字表示每个人的状态,然后检验。这串数字相当于已经把这些人的状态定了下来,如果和输入的情况不符则这串数字不正确,直接忽略,因为枚举了所有的情况,所以总有正确的,不必在错误的状态下找寻正确的人数。

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int a[17][17],b[17][17];
 5 int xx[17];
 6 int num[17];
 7 int n;
 8 int check(int x){
 9     memset(num,0,sizeof(num));
10     int ans=0;
11     int cnt=1;
12     while(x){
13         if(x&1){
14             num[cnt]=1;
15             ++ans;
16         }
17         x/=2;
18         ++cnt;
19     }
20     int flag=0;
21     for(int i=1;i<=n;++i){
22         if(num[i]){
23             for(int j=1;j<=xx[i];++j){
24                 if(b[i][j]==1&&!num[a[i][j]])
25                     flag=1;
26                 else if(b[i][j]==0&&num[a[i][j]])
27                     flag=1;
28             }
29         }
30     }
31     if(!flag)
32         return ans;
33     return 0;
34 }
35 int main(){
36     ios::sync_with_stdio(false);
37     cin.tie(NULL);
38     cout.tie(NULL);
39     cin>>n;
40     for(int i=1;i<=n;++i){
41         cin>>xx[i];
42         for(int j=1;j<=xx[i];++j){
43             cin>>a[i][j]>>b[i][j];
44         }
45     }
46     int lastans=0;
47     for(int i=0;i<=(1<<n)-1;++i)
48         lastans=max(lastans,check(i));
49     cout<<lastans;
50     return 0;
51 }
posted @ 2019-12-21 10:14  sewage  阅读(221)  评论(0编辑  收藏  举报