毒水做题笔记

海棠又落微雨时

毒水

毒水

题意

\(n\) 瓶水,一瓶有毒,你有 \(k\) 只小白鼠。你可以让每只小白鼠喝若干瓶水,如果一只白鼠喝了毒水就会死亡,否则会活。你必须一次性给定让每只白鼠和哪些瓶水的方案,然后交互库返回每只白鼠是否死亡。但是有一只白鼠的数据会被改变(死亡和活着交换)
要求判断出毒水的位置。
数据范围:\(n\leq1000, k>14\)

解析

如果没有改变数据,容易想到二进制分组,即让每只白鼠掌管二进制下的每一位(让他喝下二进制某一位是 \(1\) 的所有水)。
如果这只白鼠死亡,说明毒药的对应位是 \(1\)。这样只需要 \(\log{n}\) 只白鼠。

考虑有改变数据的情况,因为我们有 \(15\) 只白鼠,需要 \(10\) 只老鼠掌管二进制每一位(称呼它们是普通鼠)。
考虑多出来的 \(5\) 只如何使用。发现 \(2^5=32\),因此多的 \(5\) 只老鼠带来的信息量实际上是想当少的。基本上只够找出被篡改的数据,因此考虑使用 \(5\) 只老鼠定位被篡改的数据位置。
实际上可以沿用之前的思路,考虑二进制分组的形式定位被篡改的数据。
为此,我们需要一个办法,可以使用一只老鼠的代价,断言一个普通鼠集合 \(S\) 中有数据被篡改。发现可以使用异或的形式。(设 \(1\) 代表死亡,\(0\) 代表活着)只要让某只老鼠的状态是 \(S\) 中所有老鼠的状态的异或和,那么就容易使用这只老鼠检验 \(S\) 中的数据是否都准确。
具体来说,如果一瓶水被 \(S\) 中的老鼠喝了奇数次,则让那只老鼠也喝一下,容易证明这样是符合异或要求的。

现在,我们已经能否让一只老鼠来“监管”若干只老鼠,只需要 \(4\) 只老鼠就能监管所有的普通鼠。
现在还有最后一个问题,会不会有监管鼠的数据被篡改。
方法也很简单,只需要让最后一只老鼠监管所有的监管鼠即可。
那万一最后一只老鼠的数据错了怎么办?实际上不管是最后一只老鼠数据错了,还是监管鼠数据错了,都不重要,此时直接按照普通鼠的数据计算即可。

总结

很牛的交互题,如果数据没有改变,这个问题是简单的。而关键在于想到用异或的形式来监管某一批老鼠的数据正确性。
比较平凡的一个想法是使用或的形式监管(让监管鼠喝下它监管的鼠的所喝的水)。但这样没法保证正确性,因为或的结果并不和所有数都相关,相比之下,异或显然是合适的选择。

posted @ 2025-02-27 14:49  yanzihe  阅读(38)  评论(0)    收藏  举报