1 //Result:wizmann 3185 Accepted 728K 16MS G++ 2340B
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <iostream>
6 #include <algorithm>
7 #include <iostream>
8
9 using namespace std;
10
11 #define print(x) cout<<x<<endl
12 #define input(x) cin>>x
13 #define SIZE 20
14
15 /*
16 * 先用高斯消元法求出正确解,然后通过穷举自由元dfs求出最优解
17 */
18
19 int mat[SIZE+5][SIZE+5];
20 int ptr;
21 int ans[SIZE],x[SIZE];
22 int tmp_mat[SIZE+5][SIZE+5];
23
24 void init()
25 {
26 for(int i=0;i<SIZE;i++)
27 {
28 if(i-1>=0) mat[i][i-1]=1;
29 mat[i][i]=1;
30 if(i+1<SIZE) mat[i][i+1]=1;
31 }
32 }
33
34 int dfs(int v)
35 {
36 if(v==20)
37 {
38 int temp=0;
39 for(int i=0;i<SIZE;i++) x[i]=ans[i];
40 memcpy(tmp_mat,mat,sizeof(mat));
41 for(int i=ptr-1;i>=0;i--)
42 {
43 for(int j=i+1;j<SIZE;j++)
44 {
45 tmp_mat[i][SIZE]^=(x[j]&tmp_mat[i][j]);
46 //设定自由元后,再次进行高斯消元,确定正确答案,从而求出最优解
47 }
48 x[i]=tmp_mat[i][SIZE];
49 }
50 for(int i=0;i<SIZE;i++)
51 {
52 if(x[i]) temp++;
53 }
54 return temp;
55 }
56 ans[v]=0;
57 int res=dfs(v+1);
58 ans[v]=1;
59 res=min(res,dfs(v+1));
60 return res;
61 }
62
63
64 int gauss()
65 {
66 for(int row=0,col=0;row<SIZE&&col<SIZE;col++)
67 {
68 int zptr=-1;
69 for(int i=row;i<SIZE;i++)
70 {
71 if(mat[i][col])
72 {
73 zptr=i;
74 break;
75 }
76 }
77 if(zptr==-1)
78 {
79 //print(col);
80 continue;
81 }
82 for(int i=0;i<=SIZE;i++)
83 {
84 swap(mat[row][i],mat[zptr][i]);
85 }
86
87 for(int i=0;i<SIZE;i++) if(i!=row)
88 {
89 if(!mat[i][col]) continue;
90 for(int j=0;j<=SIZE;j++)
91 {
92 mat[i][j]^=mat[row][j];
93 }
94 }
95 row++;
96 ptr=row;
97 }
98 if(ptr==SIZE)
99 {
100 int ans=0;
101 for(int i=0;i<SIZE;i++)
102 {
103 if(mat[i][SIZE]) ans++;
104 }
105 return ans;
106 }
107 else return dfs(ptr);
108 }
109
110
111
112 int main()
113 {
114 int a;
115 init();
116 for(int i=0;i<SIZE;i++)
117 {
118 input(a);
119 mat[i][SIZE]=a;
120 }
121 print(gauss());
122 return 0;
123 }