混合颜料
来源:互联网 发布:三维图形制作软件 编辑:程序博客网 时间:2024/04/20 12:49
Question
你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料?
Algorithm
摘自牛客网答案
在C++中,将两个数进行xor,用的是^符号,但是实际上是将十进制转换为二进制之后,再进行xor,这样,这n个十进制的数,就被转换成了n个二进制的包含1,0的字符串,将每个数转换成二进制之后单成一行,位数小的前面被补全0,这样这n个数就变成了n行矩阵,由于1 ≤ xi ≤ 1,000,000,000,而2的30次幂是10亿多,所以这个矩阵最大是n*30的矩阵。
现在将这个矩阵列出来,如:
101010
111010
101101
110110
然后进行行与行之间的xor,其中1^1=0; 0^0=0; 1^0=1; 0^1=1;
有没有发现这种运算很像求矩阵的秩?相同的相减为0,不同的相减为1.
矩阵的秩定义:是其行向量或列向量的极大无关组中包含向量的个数。
矩阵的秩求法:用初等行变换化成梯矩阵, 梯矩阵中非零行数就是矩阵的秩.
所以这道题就被转化成了求矩阵的秩
Accepted Code
#include<iostream>#include<vector>#include<algorithm>using namespace std;int getBit(int x){ int cnt=0; while(x){ x=x>>1; cnt++; } return cnt;}int main(){ int n; while(cin>>n){ vector<int> v(n,0); for(int i=0;i<n;i++){ cin>>v[i]; } int res=0; sort(v.begin(),v.end()); int j=v.size()-1; while(v.size() > 2){ if(getBit(v[j]) == getBit(v[j-1])){ int tmp = v[j]^v[j-1]; if(find(v.begin(),v.end(),tmp) == v.end()){ v.push_back(tmp); sort(v.begin(),v.end()); } } else res++; v.pop_back(); // 最后一个元素还是最后一个,delete j=v.size()-1; } cout<<res+v.size()<<endl; } return 0;}
阅读全文
0 0
- 混合颜料
- 混合颜料
- 混合颜料
- 混合颜料
- poj 2709 混合颜料
- 高斯消元(混合颜料)
- 网易笔试题:混合颜料
- 网易笔试题 混合颜料
- POJ 2709 混合颜料 acm 贪心
- 网易笔试编程题-混合颜料
- 混合颜料(求矩阵的秩问题)
- 2017网易内推笔试题---混合颜料
- 混合颜料-网易python(求矩阵的秩)
- 网易2017内推笔试2:混合颜料 [python]
- 混合颜料问题-网易的笔试题目(高斯消元找极大线性无关组)
- 网易2017内推笔试编程题合集(二)第一题 混合颜料
- 网易内推编程题:异或运算求混合颜料的最小种类
- 最少颜料
- Highways (最小生成树)
- autoencoder
- 三分搜索--hdu2241 考研路茫茫——早起看书
- 文件如何转换成pdf或html格式
- 剑指offer之重建二叉树
- 混合颜料
- 4399: 魔法少女LJJ
- Java中字符串的使用
- low RBA
- HDU-3665-Seaside
- maven开发下tomcat部署war包,没有报错但是访问不了站点任何资源和接口。
- 1347
- 杭电acm 1365 数论
- 8-7 DAIRY