C++ 求矩阵的秩

C++ 求矩阵的秩网易笔试题:混合颜料下面 int getNumOfLeastColors(setint>& colorSet) {// 求二进制矩阵的秩,即消元,最后看斜对角线上有几个 1  的方法,就是求矩阵的秩你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的

大家好,又见面了,我是你们的朋友全栈君。

网易笔试题:混合颜料


下面 

  1. int getNumOfLeastColors(set<int>& colorSet) {
    // 求二进制矩阵的秩,即消元,最后看斜对角线上有几个 1  

的方法,就是求矩阵的秩

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


输入描述:

第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)

第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.




输出描述:

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




输入例子:

29

4096 8192 16384 32768 65536 131072 262144 524288 1048576 16 32 64 128 256 512 1024 2048 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 999999999 1000000000 15


输出例子:

27


思路:将所有的数二进制展开,构成一个矩阵,通过消元只保留对角线上 1,即求矩阵的秩,最后得到 1 的个数即秩的大小,也就是最少需要的颜色数。


C++实现:

[cpp] 
view plain
 copy

  1. #include <iostream>  
  2. #include <set>  
  3. #include <vector>  
  4.   
  5. const int N = 8 * sizeof(int);// 整型 int 的二进制位数  
  6.   
  7. using namespace std;  
  8.   
  9. void getBinaryMat(const set<int>& s, vector<vector<int> >& bMat) {
    // 求每个数的二进制,存储在vector里面,最后得到二进制矩阵  
  10.     if(s.empty()) return;  
  11.     for(set<int>::iterator it=s.begin(); it != s.end(); it++) {  
  12.         vector<int> v(N);  
  13.         int flag = 1;  
  14.         for(int i=0; i < N; i++) {  
  15.             v[i] = (*it) & flag;  
  16.             flag <<= 1;  
  17.         }  
  18.         bMat.push_back(v);  
  19.     }  
  20. }  
  21.   
  22. int getNumOfLeastColors(set<int>& colorSet) {
    // 求二进制矩阵的秩,即消元,最后看斜对角线上有几个 1  
  23.     if(colorSet.empty()) return -1;  
  24.     vector<vector<int> > bMat;  
  25.     getBinaryMat(colorSet, bMat);  
  26.     const int Row = bMat.size();  
  27.     int r = 0, c = 0;  
  28.     for(c=0; c < N && r < Row; c++, r++) {
    // 从每一列开始,将每一列消到只有 1 个 1 或者全 0  
  29.         int i = 0;  
  30.         for(i = r; i < Row; i++) {
    // 寻找这一列第一个非 0 的行  
  31.             if(bMat[i][c] != 0)  
  32.                 break;  
  33.         }  
  34.         if(Row == i)  
  35.             –r;  
  36.         else {  
  37.             swap(bMat[r], bMat[i]);  
  38.             for(int k=i+1; k < Row; k++) {  
  39.                 if(0 != bMat[k][c]) {  
  40.                     for(int j=c; j < N; j++) {  
  41.                         bMat[k][j] ^= bMat[r][j];// 用第 r 行的 1 消除这一列上其他所有行的 1  
  42.                     }  
  43.                 }  
  44.             }  
  45.         }  
  46.     }  
  47.     return r;  
  48. }  
  49.   
  50. int main() {  
  51.     int n;  
  52.     while(cin >> n) {  
  53.         set<int> colorSet;  
  54.         int color;  
  55.         for(int i=0; i < n; i++) {  
  56.             cin >> color;  
  57.             colorSet.insert(color);  
  58.         }  
  59.         cout << getNumOfLeastColors(colorSet) << endl;  
  60.     }  
  61.     return 0;  
  62. }  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139096.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月7日 上午8:20
下一篇 2022年5月7日 上午8:20


相关推荐

  • 笔记总结-相机标定(Camera calibration)原理、步骤

    笔记总结-相机标定(Camera calibration)原理、步骤      这已经是我第三次找资料看关于相机标定的原理和步骤,以及如何用几何模型,我想十分有必要留下这些资料备以后使用。这属于笔记总结。1.为什么要相机标定?      在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。2.什么叫相机标定?       在大多数条件下这些参数必须通…

    2022年5月28日
    94
  • 现今最强引擎对比!虚幻3 vs CE2 vs 寒霜2.0

    现今最强引擎对比!虚幻3 vs CE2 vs 寒霜2.0网上看到很多的精华内容 自己花了很久时间搜集了很多的资料 用自己浅薄的一点知识跟大家探讨 虚幻 3 老了这的确有点不合算 但是配置要求上绝对赢了 主要代表作 战争机器 虚幻竞技场 3 主讲 特别画面作品之一镜子边缘 然后再贴点 MOH 的就完事了 所以虚幻 3 部分特别少 好吧开讲 在 ZZT 热卖的那段时间 TimSweeney 将 PotomacCompu 改名为

    2026年3月16日
    2
  • zookeeper系列学习——(2)zookeeper的安装(windows、Linux)[通俗易懂]

    这一篇总结zookeeper的安装,这一篇安装的介绍是为了以后使用zookeeper做铺垫! 一:单机版的zookeeper安装 要安装zookeeper,那么首先要现在安装包,下载的地址:http://mirrors.hust.edu.cn/apache/zookeeper/ 安装的文档:http://zookeeper.apache.org/doc/trunk/zookeeperStart

    2022年2月25日
    57
  • 计算机视觉项目实战-图像特征检测harris、sift、特征匹配

    计算机视觉项目实战-图像特征检测harris、sift、特征匹配对于图像特征检测的应用场景有很多 比如目标检测 物体识别 三维重建 图像配准 图像理解 我们可以识别出来一些特定的关键点来让计算机认识图像的某些特征 该应用也应用于目前较为火热的人脸识别技术当中 后续我们我介绍一下有关于人脸识别的项目实战 这节课先跟着我 做一下这个图像特征如何检测的 它是基于什么原理 原理图 这里第一个图表示的就是平面灰度值没有明显变化 第二个图就是要给边界灰度值水平方向变化明显垂直方向灰度值变化并不明显 第三个图表示的就是一个角点 无论水平还是垂直方向都很明显 主要看灰度级的变化结果

    2026年3月18日
    2
  • 关于CommandType.StoredProcedure输出参数访问问题

    关于CommandType.StoredProcedure输出参数访问问题MSDN解释:当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure。当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,

    2022年7月26日
    9
  • VUE调试工具

    VUE调试工具3.VUE调试工具3.1调试工具安装到GitHub下载工具安装压缩包,解压到响应的文件夹。到解压的vue-devtools文件目录下安装依赖包。修改manifest.json文件,该文件在vue-devtools文件的\packages\shell-chrome下。把”persistent”:false改为”persistent”:true。”background”:{“scripts”:[“build/background.js”

    2025年8月11日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号