混合颜料问题-网易的笔试题目(高斯消元找极大线性无关组)
2016-08-11 10:06
246 查看
你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料?
输入描述:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.
输出描述:
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。
输入例子:
3
1 7 3
输出例子:
3
//这个题主要思路就是高斯消元找极大线性无关组
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
//这是快速排序的自定义规则(事实证明,这个题优化不了多长时间)
bool cmp(int a,int b)
{
return a>b;
}
//获得最高位
int highBit(int n,int i)
{
return (n&(1<<i))>>i;
}
//以亦或为主的高斯消元
int simple_gaussain(int mat[],int n)
{
int i,j,yu=0;
int matlab[60];
for(i=0;i<n;i++)
{
matlab[i]=mat[i];
yu|=matlab[i];
}
sort(matlab,matlab+n,cmp);
i=0;
int be;
while(i<n-1&&be!=0)
{
be=floor(log(yu)/log(2));
if(highBit(matlab[i],be)!=1)
{
for(j=i+1;j<n;j++) if(highBit(matlab[j],be)==1)
break;
matlab[i]^=matlab[j];
}
for(j=0;j<n;j++) if(j!=i && highBit(matlab[j],be)==1 )
{
matlab[j]^=matlab[i];
}
i++;
yu-=(1<<be);
}
int ret=0;
for(i=0;i<n;i++) if(matlab[i])
ret++;
return ret;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test2.out","w",stdout);
int n,i;
int color[60];
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%d",&color[i]);
int ans=simple_gaussain(color,n);
printf("%d\n",ans);
}
return 0;
}
输入描述:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.
输出描述:
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。
输入例子:
3
1 7 3
输出例子:
3
//这个题主要思路就是高斯消元找极大线性无关组
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
//这是快速排序的自定义规则(事实证明,这个题优化不了多长时间)
bool cmp(int a,int b)
{
return a>b;
}
//获得最高位
int highBit(int n,int i)
{
return (n&(1<<i))>>i;
}
//以亦或为主的高斯消元
int simple_gaussain(int mat[],int n)
{
int i,j,yu=0;
int matlab[60];
for(i=0;i<n;i++)
{
matlab[i]=mat[i];
yu|=matlab[i];
}
sort(matlab,matlab+n,cmp);
i=0;
int be;
while(i<n-1&&be!=0)
{
be=floor(log(yu)/log(2));
if(highBit(matlab[i],be)!=1)
{
for(j=i+1;j<n;j++) if(highBit(matlab[j],be)==1)
break;
matlab[i]^=matlab[j];
}
for(j=0;j<n;j++) if(j!=i && highBit(matlab[j],be)==1 )
{
matlab[j]^=matlab[i];
}
i++;
yu-=(1<<be);
}
int ret=0;
for(i=0;i<n;i++) if(matlab[i])
ret++;
return ret;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test2.out","w",stdout);
int n,i;
int color[60];
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%d",&color[i]);
int ans=simple_gaussain(color,n);
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- 网易笔试题目:三列布局,中间自适应宽度,双飞翼布局,及问题
- HDU 3364 Lanterns(高斯消元入门题目——开关问题)
- 网易笔试题:混合颜料
- 网易2017内推笔试编程题合集(二)第一题 混合颜料
- 网易笔试编程题-混合颜料
- HDOJ 题目3364 Lanterns(高斯消元,开关灯问题)
- 2017网易内推笔试题---混合颜料
- 网易2017内推笔试2:混合颜料 [python]
- 高斯消元(混合颜料)
- 网易笔试——混合颜料
- HDOJ 题目3364 Lanterns(高斯消元,开关灯问题)
- [省选前题目整理][POJ 1830]开关问题(XOR方程组高斯消元)
- 网易笔试题 混合颜料
- 网易运维程序开发工程师笔试题目
- poj1830 开关问题解题报 <高斯消元>
- POJ 1830 开关问题 高斯消元
- poj 1830 开关问题 (高斯消元 )
- 网易2012校园招聘笔试题目
- 试题:网易笔试的一道题目
- 分享一道笔试题目--关于static和extern变量的问题