标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 4623 | Accepted: 1812 |
Description
Input
Output
Sample Input
0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0
Sample Output
3
Hint
Source
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define INF 0x3f3f3f3f
int Map[25][25] , a[25] , freex[25] , x[25] ;
void swap1(int p,int q)
{
int i , temp ;
temp = a[p] ;
a[p] = a[q] ;
a[q] = temp ;
for(i = 0 ; i < 20 ; i++)
{
temp = Map[p][i] ;
Map[p][i] = Map[q][i] ;
Map[q][i] = temp ;
}
return ;
}
int solve()
{
int i , j , k , t = 0 , num1 = 0 ;
for(i = 0 ; i < 20 && t < 20 ; i++ , t++)
{
for(j = i ; j < 20 ; j++)
if( Map[j][t] )
break ;
if( j == 20 )
{
freex[num1++] = t ;
i-- ;
continue ;
}
if( i != j )
swap1(i,j) ;
for(j = i+1 ; j < 20 ; j++)
{
if( Map[j][t] )
{
a[j] = a[j]^a[i] ;
for(k = t ; k < 20 ; k++)
Map[j][k] = Map[j][k] ^ Map[i][k] ;
}
}
}
for( ; i < 20 ; i++)
if( a[i] )
return -1 ;
if( num1 > 0 ) return num1 ;
for(i = 19 ; i >= 0 ; i--)
{
x[i] = a[i] ;
for(j = i+1 ; j < 20 ; j++)
x[i] ^= ( Map[i][j]*x[j] ) ;
}
return num1 ;
}
int main()
{
int i , j , k , min1 = INF , key , ans ;
memset(Map,0,sizeof(Map)) ;
for(i = 0 ; i < 20 ; i++)
scanf("%d", &a[i]) ;
for(i = 0 ; i < 20 ; i++)
{
Map[i][i] = 1 ;
if( i-1 >= 0 ) Map[i][i-1] = 1 ;
if( i+1 < 20 ) Map[i][i+1] = 1 ;
}
key = solve() ;
if( key == 0 )
{
ans = 0 ;
for(i = 0 ; i < 20 ; i++)
ans += x[i] ;
min1 = min(min1,ans) ;
}
else if( key > 0 )
{
int temp = 1 << key , t ;
for(t = 0 ; t < temp ; t++)
{
ans = 0 ;
memset(x,0,sizeof(x)) ;
for(j = 0 ; j < key ; j++)
if( t & (1<<j) )
{
x[ freex[j] ] =1 ;
ans++ ;
}
for(i = 19 ; i >= 0 ; i--)
{
for(k = 0 ; k < 20 ; k++)
if( Map[i][k] )
break ;
x[k] = a[i] ;
for(j = k+1 ; j < 20 ; j++)
x[k] ^= ( Map[i][j]*x[j] ) ;
ans += x[k] ;
}
min1 = min(min1,ans) ;
}
}
printf("%d\n", min1) ;
return 0;
}
poj3185--The Water Bowls(高斯消元问题3)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/43152801