返回信息流工作遇到一个问题,百思不得其解,还请大牛们点拨。跪谢先!
几个长度一样的比特数组,比如1001,1100,1010。1表示位置占用,0表示没有占用。
问题是比特数组允许循环移位,比如1001移位后和1100一样,可以做到占用位置相同,共计占用两个位置。第三个数组1010无论怎么移位,只有一个位置和前两个数组相同,所以得新增第三个占用位置。因此三个数组得占用三个位置。
如果多个比特数组,如何才能找到最小数目的占用位置,并且找到对应的各个数组的循环移位?
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #97957同步于 2019/4/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
求教大牛一个工程实际问题
weiming383
2019/4/17镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
首先,你的比特数组有多长。
如果短的话,就穷举。对于每一个比特数组,取最小(或最大)的那个。例如[110, 011],我们都可以用011来表示。
如果长的话,算一个最小表示法,O(n)的。
这样我们就把去重的问题解决了。
数组比较长
看了下最小表示法,似乎不行
比如0001101,0000011,已经是最小表示了,但实际占用数目应该是3
也许想得不对,求指正
【 在 Wizmann 的大作中提到: 】
: 首先,你的比特数组有多长。
: 如果短的话,就穷举。对于每一个比特数组,取最小(或最大)的那个。例如[110, 011],我们都可以用011来表示。
: 如果长的话,算一个最小表示法,O(n)的。
: ...................
汗[em17],就是01比特数组,允许循环移位,求相同位置是0的最大个数
000100 和100000经过循环移位后相同位置0的最大个数是5 如果多个数组,如何快速确定相同位置是0的最大个数
感觉这个问题应该是贪心的解法
[1001,1100,1010,......]
原始为0000
1001进来后,需要修改为1001
1100进来后,判断和1001最多循环移位,最多重叠为2,即1100可以通过移动产生1001,当前依旧为1001
1010,发现不论何种方法,都需要增加1位。即修改为1011
所以问题就是解决2个bit数循环移位最大重叠数,解决两两的问题就可以了
bit长度如果为64的话
(任意2个bit数最大重叠数的求解经过64循环移位一定可以求解出最优解)
那么解决整个问题的时间复杂度为64*n
分两步,第一步是去重,用最小表示法。
第二步用DP搞。
话说比较长是多长啊?100?200?
不要让大家猜嘛。。。
【 在 weiming383 的大作中提到: 】
: 数组比较长
: 看了下最小表示法,似乎不行
: 比如0001101,0000011,已经是最小表示了,但实际占用数目应该是3
: ...................