zoukankan      html  css  js  c++  java
  • 混合颜料(求线性组的基)

    题目描述

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

    输入描述

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

    输出描述

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

     

    示例1

    输入

    3

    1 7 3

    输出

    3

    分析

      因为涉及到异或操作,所以我们要把每个数字作为二进制处理,我们要用最少的颜料混合出所有想要的颜料,又因为每个颜料的二进制可以看作一个向量,等同于求向量组的基。求向量的基可以用我们在线性代数中学到的高斯消元法,最终结果呈上三角矩阵。

    def getNum(num):
        ans = 0
        while num:
            num = num / 2
            ans += 1
        return ans
    def getRank(x,n):
        for i in range(n-1):
            x[i:] = sorted(x[i:],reverse=True)
            g = getNum(x[i])
            for j in range(i+1,n):
                d = getNum(x[j])
                if d == g:
                    x[j] = x[j]^x[i]
        res = 0
        for i in x:
            if i != 0:
                res += 1
        return res
    n = int(raw_input().strip())
    x = map(int,raw_input().strip().split())
    print(getRank(x,n))
  • 相关阅读:
    初等数论初步——剩余类及其运算
    初等数论初步——同余的概念及性质
    救济金发放(模拟题打卡)
    寻找最小字典序字符串(水题打卡)
    杭电3790最短路径问题
    Android网络请求
    js制造运动的假象-------Day63
    数据切分——原理
    Android 开发中 iBeacon的使用
    HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)
  • 原文地址:https://www.cnblogs.com/Peyton-Li/p/7577889.html
Copyright © 2011-2022 走看看