码迷,mamicode.com
首页 > 其他好文 > 详细

你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的

时间:2016-08-17 11:57:40      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

输入描述:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.



输出描述:
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。

 

输入例子:
3
1 7 3

 

输出例子: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; }

 

你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的

标签:

原文地址:http://www.cnblogs.com/ranranblog/p/5779346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!