标签:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50) 第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。
3 1 7 3
#include<iostream>
#include<algorithm> using namespace std; const int bitnum=8*sizeof(int); const int N=50; int a[N]; int bitarray[N][bitnum]; int n; void getbit() { for(int i=0;i<n;i++) { int temp=a[i]; int flag=1; for(int j=0;j<bitnum;j++) { if(temp&flag) bitarray[i][bitnum-j-1]=1; else bitarray[i][bitnum-j-1]=0; flag=flag<<1; } } } int getvalue() { getbit(); int result=0,col=0,row=0;
//高斯消元过程 for(;col<bitnum;col++,result++) { for(row=result;row<n;row++)//result之前的行是已经消元过的行,满足bitarray[result][col]=1,这个循环是找到col列中第一个不为1的行
{
if(bitarray[row][col]) break; } if(row==n)//表明没有找到,因为循环有一个result++,所以这有个result-- result--; else { swap(bitarray[row],bitarray[result]);//交换找到的行和result行 for(int i=row+1;i<n;i++)//从row+1行开始查找,找不为1的行 { if(bitarray[i][col])//相当于第i行元素减去第result行 { for(int j=col;j<bitnum;j++) bitarray[i][j]^=bitarray[result][j]; } } } } return result; } int main() { while(scanf("%d",&n)>0) { for(int i=0;i<n;i++) scanf("%d",&a[i]); int ans=getvalue(); cout<<ans<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/ranranblog/p/5779346.html