题目描述:你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料?
输入描述:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.

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

输入例子:
3
1 7 3

输出例子:
3
做法类似于求用初等行变换来求矩阵的秩。要得到唯一的颜料数字个数,就是求出该矩阵线性无关的基底个数,即秩。将每个数字按照从小到大排列,他们的二进制形式可以看成是一个矩阵,比如1,7,3这三个数字,首先从小到大排列:1,3,7。将他们用二进制表示即为
0001
0011
0111,
官网给的这个例子不好,因为这个矩阵不需要初等行变换就能得到它的秩为3,为此,我们重新造一组输入用例:1, 2, 3, 6, 7, 8, 13。虽然很简单,但能说明问题就好,他们的二进制表示为:
第一行:0001
第二行:0010
第三行:0011
第四行:0110
第五行:0111
第六行:1000
第七行:1011
我们从前往后进行扫描(当然也可以从后往前开始扫描),在这个矩阵中,第二行和第三行最高位可以消除,经过异或,消除最高位,即得到0001,判断该数字在矩阵中是否存在,如果存在,就不插入;第四行和第五行可以消除,经过异或,消除最高位,即得到0001,判断该数字在矩阵中是否存在,如果存在,就不插入;第六行和第七行可以消除,经过异或,消除最高位,得到0011,判断该数字在矩阵中是否存在,若存在,就不插入。
因为我们是要求出基数的个数,所以对于高位相同的两个数字,我们可以删除一个,保留该种类的基数存在一个即可。得到的结果为:
第一行:0001
第二行:0010
第三行:0110
第四行:0011
重新进行排序有:
第一行:0001
第二行:0010
第三行:0011
第四行:0110
继续对相邻两行进行异或操作,得到:
第一行:0001
第二行:0010
第三行:0110
因此,得到该矩阵的秩:3,也就是说,数字1, 2, 3, 6, 7, 8, 13,可有三个数经过异或得到,这三个数可以是:1,2,6,也可以是其他(其他可能是由于选择删除两个高位相同的数字不同而得到不同的数字)。
算法描述:
首先读入元素并存入动态数组vector中,并 对元素从小到大进行排序。开始循环, 定义while循环条件,当动态数组元素个数大于2时,继续循环(因为若要进行颜料混合,最少需要2个,当动态数组的元素少于2个时,就不用进行初等行变换了,即不需要颜色混合了),在循环体外定义了两个下标分别指向动态数组倒数第一个和倒数第二个,判断下标所指向的数字最高位1的位置是否相同,如果相同,则进行异或操作,再判断得到的新值是否在数组中,如果不在,则将新值插入动态数组中,再对其进行排序。如果下标所指向的数字最高位1的位置不同,则计数器加一,将动态数组最后一个元素弹出,两个下标上移(自减)。重复这个过程,直到循环结束,输出动态数组中元素个数(其实是2)+ 计数器值即得到颜料数字基的个数,也就是秩的大小。
程序代码如下:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int theNumOfOne(int num);int main(void)
{int n;cin >> n;vector<int> nums;while (n--){int temp;cin >> temp;nums.push_back(temp);}sort(nums.begin(), nums.end());int rank = 0;int theLastOne = nums.size() - 1;int uperOfTheLastOne = theLastOne - 1;while(nums.size() > 2){if (theNumOfOne(nums[theLastOne]) == theNumOfOne(nums[uperOfTheLastOne])){int newNum = nums[theLastOne] ^ nums[uperOfTheLastOne];if (find(nums.begin(), nums.end(), newNum) == nums.end()){nums.push_back(newNum);sort(nums.begin(), nums.end());theLastOne ++;uperOfTheLastOne ++;}}else{rank ++;}nums.pop_back();theLastOne --;uperOfTheLastOne --;}cout << rank + 2 << endl;return 0;
}int theNumOfOne(int num)
{int cnt = 0;while(num){cnt ++;num >>= 1;}return cnt;
}

若有错误之处,敬请指正。

网易笔试编程题-混合颜料相关推荐

  1. 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题

    为什么80%的码农都做不了架构师?>>> 尝试挑战了下网易2017校招的笔试编程题,共三题,AC第一题,第二题思考了很久勉强用一种low逼的方式完成,第三题没有完成,希望路过的ACM ...

  2. 【牛客网】网易2017内推笔试编程题合集(二)

    1.[*][编程题] 混合颜料 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料.为了让问题简单,我们用正整数表示不同颜色的颜料.你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买 ...

  3. 魔法币 java_网易2018校招笔试编程题-魔法币 java实现

    魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...

  4. 大厂offer?拿来吧你!网易有道笔试编程题特辑

    联系我们:有道技术团队助手:ydtech01 / 邮箱:ydtech@rd.netease.com 欢迎应届生同学们 来到2022年校招运动会 现在迎面向你们走来的 是网易有道代表队! (传送门:ht ...

  5. 从网易校招编程题谈起,轻松理解有趣的0-1背包问题

    从网易的一道算法题开始 最近在准备春招实习,偶然做到网易的一道编程题,一方面找了很多博客看的云里雾里,这里特别写下解题的思路和逻辑,一方面加深印象,另一方面供需要的你学习参考.好了,话不多说,开始吧. ...

  6. python算法预测风险等级_一般算法水平到底什么样子才能秒杀Bat的笔试编程题?...

    很简单,打开 LintCode 随便找一道中等难度的题,如果能很快找到思路并提交代码通过,那么BAT公司的笔试编程题基本没什么问题了.(唯一需要注意的是国内公司笔试题目一般都很长,比较考验阅读理解能力 ...

  7. 经典笔试编程题--Java实现

    转载自  经典笔试编程题--Java实现 1.输入一个正数n,输出所有和为n的连续正数序列.  分析:设定两个指针,min指向和为n的连续正数序列的最小值,max指向和为n的连续正数序列最大值.sum ...

  8. 美团点评2017秋招笔试编程题

    美团点评2017秋招笔试编程题 1, 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n<=骰子最大点数且是 ...

  9. 2020哔哩哔哩校招后端开发笔试编程题总结

    2020哔哩哔哩校招后端开发笔试编程题总结 1.给定一个正整数N,试求有多少组连续正整数满足所有数字之和为N? (1 <= N <= 10 ^ 9) 暴力求解法: package Day4 ...

最新文章

  1. ES6精华:字符串扩展
  2. 数据快传对于企业的重要性!
  3. leetcode算法题--环形链表
  4. 【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )
  5. Hive SQL优化之 Count Distinct
  6. Angular 界面元素的条件渲染
  7. lua工具库penlight--08额外的库(二)
  8. elementui的css文件没有引入_Python中引入模块详细介绍,使用模块的过程中注意事项教程...
  9. 003.DNS主从正反解析部署
  10. 联想x100e linux,进化之道!ThinkPad X100e全球首发测试
  11. 关于Flex2的资料
  12. 搭建SSM项目时报错(org.springframework.jdbc.CannotGetJdbcConnectionException)
  13. 【全套资料.zip下载】数电课设-色子骰子模拟电路Multisim仿真设计【Multisim仿真+报告+讲解视频.zip下载】
  14. 怎么安装sqlserver2000数据库出现挂起提示
  15. vga接口和hdmi接口的区别
  16. iphone 代码片段2
  17. 华为/华三交换机配置SSH免密登录
  18. elasticsearch高级搜索功能多维度分享
  19. Java基础篇:八大基本数据类型
  20. 一文搞懂什么是图神经网络GNN【入门教程】

热门文章

  1. node.js服务端笔记文档学会写接口,学习分类:path、包、模块化、fs、express、中间件、jwt、开发模式、cors。
  2. Python脚本翻译英文到汉语
  3. Python必学模块之CSV模块
  4. 【蓝桥杯算法练习题】双指针、BFS与图论
  5. 安卓系统python编程pygame_【Python游戏编程01--初步认识pygame】
  6. allure生成测试报告时乱码,allure‘ �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���
  7. ImportError: cannot import name ‘SAVE_STATE_WARNING‘ from ‘torch.optim.lr_scheduler‘ (/home/jsj/anac
  8. kali2020.1版本,wifi异常连接提示没有固件,安装无线网卡驱动,及相关的组件
  9. 异类 不一样的成功启示录
  10. 如何彻底删除Sql server 2008数据库