View Code
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 }