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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)