POJ2724:Purifying Machine——题解】的更多相关文章

http://poj.org/problem?id=2724 描述迈克是奶酪工厂的老板.他有2^N个奶酪,每个奶酪都有一个00 ... 0到11 ... 1的二进制数.为了防止他的奶酪免受病毒侵袭,他用一台净化机器来清理感染病毒的奶酪.净化机有N个开关,每个开关有三个状态,1,0和*.一次操作中,最多可用*一次,它可以代替1或0.当机器转到一个特定的状态时,操作将清除所有相应的二进制数字的奶酪. 有一天,迈克的机器被感染了.当麦克发现时,他已经做了一些操作,这台受感染机器操作的奶酪也被感染了.他…
嘟嘟嘟 扒下来的题意:迈克有一台可以净化奶酪的机器,用二进制表示净化的奶酪的编号.但是,在某些二进制串中可能包含有\(*\).例如\(01*100\),\(*\)其实就代表可以取\(0\),\(1\)两种情况:\(010100\) 和\(011100\).现在由于迈克不小心,他以同样的方式弄脏了某些奶酪,问你最少用多少次操作就可以把弄脏的奶酪全净化好.(没有被弄脏过的奶酪不能净化.弄脏过的奶酪可以多次净化.) 也就是给你一些不同的(判重之后)二进制串,每个串可以通过1次操作净化,也可以把两个只有…
POJ 2724 Purifying Machine 题目链接 题意:这题题意有点没看懂.看了别人的题解, 给出m串长度为n的01串. 有些串中可能包括,这种串能够表示两个串,为1 和为0. 反复的算一种.比方题目中01 100 011 就代表了四个01串 001 101 100 011 如今我们须要消灭掉全部的01串,消灭方式有两种: 1一次消灭一个串. 2假设两个串的区别仅仅有一位的话能够同一时候消灭这两个串. 问最少多少次操作能够消灭全部的01串 思路:把存在的二进制数保存下来,然后去重.…
Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5408   Accepted: 1575 Description Mike is the owner of a cheese factory. He has 2N cheeses and each cheese is given a binary number from 00...0 to 11...1. To keep his chee…
http://poj.org/problem?id=2724 (题目链接) 题意 Mike有一个机器可以帮助他清理奶酪,每个奶酪由一个n位二进制数表示,机器上一共有n个按钮,每个按钮有1,0,*,其中‘*’表示既可以是1也可以是0.每次操作都可以命令机器生成一个二进制数.因此机器可以表示出一个或两个二进制数,这样就可以清理奶酪了.现在问要清理m块n位的二进制奶酪需要操作多少次. Solution 如果两个奶酪只有一位不同,那么就可以通过一次操作将两个都消掉,这样的奶酪当然是越多越好,因此,很容易…
题意 给定m个长度为n的01串(*既表示0 or 1.如*01表示001和101).现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个:②如果有两个串仅有一个字符不同,则可以同时删除这两个.求最少要多少次可以删完,并且同一个串不能删两次. 思路 我们用点表示一个串,如果两个串之间只有一个字符不同,那么这两个串之间连接一条,最大匹配数就是节省的次数. 因为每个串中的1为奇数的串之间是不能匹配的(不可能只有1个不同),同理,偶数也是.所以,可以按照1的奇偶性把数据分成2份,所以是一个二分…
题意: 给m个长度为n的模板串,模板串由0和1和*三种组成,且每串至多1个*,代表可0可1.模板串至多匹配2个串,即*号改成0和1,如果没有*号则只能匹配自己.问:模板串可以缩减为几个,同样可以匹配原来m个串同样能匹配的所有串. 思路: 差点想不出是二分图匹配了. 将原来m个串所能匹配的串给取出来放到集合中(记得去重),编上号.并为他们黑白着色,源点到白色点有容量1的边,黑色点到汇点有容量为1的边,对于该白色点所能匹配的所有黑色点,都有一条容量为1的边.跑一次最大流,得知匹配对数,这些匹配的都只…
题目大意:每一个01串中最多含有一个‘*’,‘*’既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串.如:000.010.0*1表示000.010.001.011,最少只需用00*.01*这两个即可表示出来. 题目分析:如果有两个串只有一个位置上的数字不同,就可以用*代替这个位置上的数,这样就能把两个串用一个串表示出来.因为要找最少的数目,当然‘*’用的越多越好,也就是说只需找出最多的对数,然后再加上不用‘*’表示的串的数目便是最小值. 代码如下: # inc…
题意:每一个01串中最多含有一个‘*’,‘*’既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串. 如:000.010.0*1表示000.010.001.011,最少只需用00*.01*这两个即可表示出来. 析:因为最多只有一个星,所以每个串最多能代表两个串,所以就是要两两匹配的尽量多,也就是二分匹配喽,要注意,给的串可能会有重复的. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo…
模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了.所以就是找一个二分图最大匹配. 因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行了. 也有另外一种写法不用除以2的. #include<bits/stdc++.h> using namespace std; ; <<maxn; #define debug(x)\ bitset<> bs(x);\ cout<<bs<<endl;…