前言
2025年的ACM区域赛北京站上,前辈率先独自AC了一道签到题。比赛后我问前辈是什么题目,前辈说是天平称次品的问题。哦那没事了,确实是道水题。但是我看了一眼题目发现,题目说到,并不清楚次品和正品的轻重关系,这咋做啊?再看了一眼前辈的代码,核心的公式是 x = ⌈ log 3 ( 2 n ) ⌉ x=\lceil \log_3(2n) \rceil x=⌈log3(2n)⌉ 。WTF?我回去认真思考了一下,发现前辈的答案确实是对的。
天平称次品问题其实有两类:
A:n个物品里有1个次品,并且次品比正品重,问至多需要称多少次?
B:n个物品里有1个次品,但不知道次品和正品谁更重,问至多需要称多少次?
对于A类问题十分简单,假如是9个物品,那么就拿出6个放在天平的左右侧(记作 3 v 3 ∼ 3 3v3\sim3 3v3∼3,最后的3表示剩下3个没有称)。如果天平倒向左边,那么次品就在左边3个里;倒向右边,就在右边3个里;水平的话,次品则是在剩下的3个里。无论哪种情况都是变成了3个物品里有1个次品,然后依样画葫芦进行 1 v 1 ∼ 1 1v1\sim1 1v1∼1即可。
所以3个物品只需1次,9个物品只需2次,27个物品只需3次…… 3 n 3^n 3n个物品就只需n次。至于不是3的幂,则需要往上进一,用公式写就是: x = ⌈ log 3 n ⌉ x=\lceil \log_3n \rceil x=⌈log3n⌉。
对于B类问题,则要复杂很多。
从13出发
对于B类问题,我们举一个实际的例子,13个物品里有1个次品,答案是3次。我给出了具体的决策树:
具体地,首先我们拿出8个,天平左右各4个,剩下5个(记作 4 v 4 ∼ 5 4v4\sim5 4v4∼5)。如果天平是水平的,说明次品在剩下的5个里,不平则在这8个里,但由于不清楚次品和正品的轻重关系,因此无法确定在左边4个还是右边4个。
- 如果次品在剩下的5个里,我们拿出3个,和已确定是正品的8个里中的3个,放在天枰的左右侧(记作
3
v
3
‾
∼
2
3v\overline{3}\sim2
3v3∼2,
3
‾
\overline{3}
3表示3个正品)。如果天平是水平的,说明次品在剩下的2个里,不平则是在那3个里。
- 剩下的2个有次品的话,只要拿1个和1个正品称( 1 v 1 ‾ ∼ 1 1v\overline{1}\sim1 1v1∼1),水平就是剩下的是次品,不平就是这个是次品
- 这3个有次品的话,我们发现我们其实已经知道了次品和正品的轻重关系,因为 3 v 3 3v3 3v3时。如果天平往左倒,说明次品更重;如果往右倒,说明次品更轻。知道轻重关系的话,这个问题就退化成A类问题了,3个物品就是 1 v 1 ∼ 1 1v1\sim1 1v1∼1。
- 如果次品在那8个里,第一次的天平有可能是往左倒,也有可能是往右倒,但是这两种情况其实是一样的,是对称的,那么不失一般性,我们只考虑往左倒的情况。我们拿出左边4个中的3个,和右边4个中的2个,放在天平左边,然后拿出5个正品(第一次称剩下的5个刚好)放在天平右边,进行称量(记作
(
3
+
2
)
v
5
‾
∼
(
2
+
1
)
(3+2)v\overline{5}\sim(2+1)
(3+2)v5∼(2+1)),注意到这次称量只要不平,就可以得到轻重关系。如果水平,说明次品在剩下的2+1个;如果不平,说明次品在那3+2个中
- 剩下的2+1个有次品的话,我们取出左边1个和右边1个放在天平左边,再拿2个正品放在天平右侧,进行称量(记作 ( 1 + 1 ) v 2 ‾ ∼ ( 1 + 0 ) (1+1)v\overline{2}\sim(1+0) (1+1)v2∼(1+0))。如果天平是水平的,就是剩下的左边1个是次品,如果是不平的,我们可以得到轻重关系。根据轻重关系,我们可以在第一次 4 v 4 4v4 4v4中知道次品是在左边的4个还是右边的4个,而第三次称量刚好是左边1个和右边1个放在天平左边,如果次品在第一次称量的左边4个,那么第三次称量的左边这个就是次品,反之右边亦然。
- 那3+2个中有次品的话,由于得到了轻重关系,与前面的情况一样,我们可以直接知道次品属于左边的3个还是右边的2个。无论是3个还是2个,由于知道了轻重关系,问题都退化成A类问题,都是1次能搞定。
前辈也给出了他的决策树:
前辈的决策树中,
4
v
4
∼
5
4v4\sim5
4v4∼5的5和我是一样的,差别在于右边的
4
+
4
4+4
4+4上。前辈取出了左边2个和右边1个放在天平左侧,然后再取出左边剩下的2个和右边的1个放在天平右侧,此时还剩下右边的2个(记作
(
2
+
1
)
v
(
2
+
1
)
∼
(
0
+
2
)
(2+1)v(2+1)\sim(0+2)
(2+1)v(2+1)∼(0+2))。
- 如果天平是平的,那么问题出在剩下的2个里,然后 1 v 1 ‾ ∼ 1 1v\overline{1}\sim1 1v1∼1即可。
- 如果天平往左倒,那么问题出在 ( 2 + 1 ) v ( 2 + 1 ) (\textcolor{red}{2}+1)v(2+\textcolor{red}{1}) (2+1)v(2+1)中标红的这两。WTF?!前辈是这么解释的,假如次品更重,那么从第一次称量可知次品在左边4个(假设了第一次称量是往左倒),这第二次也左倒,说明次品在 ( 2 + 1 ) v ( 2 + 1 ) (\textcolor{red}{2}+1)v(2+1) (2+1)v(2+1);假如次品更轻,那么从第一次称量可知次品在右边,这第二次也左倾,说明次品在 ( 2 + 1 ) v ( 2 + 1 ) (2+1)v(2+\textcolor{red}{1}) (2+1)v(2+1)。所以,情况从 4 + 4 4+4 4+4变成了 2 + 1 2+1 2+1,然后我们只拿出左边的2个分别放在天平左右,那就是 1 v 1 1v1 1v1。如果水平,说明右边剩下的1个有问题;如果不平,说明次品在左边的2个中,这样可以反推出次品是更重的,所以往哪边倾谁就是次品
- 如果天平往右倒,那么问题出在 ( 2 + 1 ) v ( 2 + 1 ) (2+\textcolor{red}{1})v(\textcolor{red}{2}+1) (2+1)v(2+1)中标红的这两。分析和操作和上面是相似的。
我的解法的关键在于第二次称量尽量能得到轻重关系,因为得到了轻重关系,问题就退化成A类问题。而得到轻重关系的关键是,天平的一边全部放的是正品。而前辈的解法,这是咋想出来的呀。。。然而,这2个解法都十分复杂,尤其是第二次和第三次称量时,有可能需要结合第一次称量是往左倒还是往右倒的信息来进行推理,这使得思考起来十分复杂。
如果将13个物品改成14个,似乎称量3次确定次品是不可能的。因为无论是 4 v 4 ∼ 6 4v4\sim6 4v4∼6还是 5 v 5 ∼ 4 5v5\sim4 5v5∼4,都有一个支路看上去不太可能,13似乎就是极限了。
十字图
我们或许可以使用更优美的方式表示这整个过程,简化我们的思考。首先,我们要从映射的角度去思考。整体上,我们的方法就是根据3次天平称量的情况,去确定哪一个物品是次品。
天平称一次其实给出了3种情况,因为天平有3种状态(往左倒,往右倒,水平)。所以称两次的话,就能表达9种情况,称三次就能表达27种情况。
物品需要从两个维度x和y去表示,x表示次品编号,y表示次品更重还是更轻。比如x=5,y=1就表示第5个物品是次品,并且次品更轻。因此13个物品的问题下,次品可能出现的情况数有13*2=26种。
27>26,因此称三次理论上能解决13个物品的问题。而14个物品就不能了,因为27<28,天平只有27种情况,一一对应也无法表达出28种次品的情况。
基于这种分析,我们可以画出一种特殊的图,我们暂时称为十字图。
这个图表示了13个物品问题第一次称量前后的状态变化,称量前,次品均有机会存在在这26个状态中,在称量后,根据天平的状态可以将这26个状态分成3份。其中标号为1表示天平往左倒的情况,这意味着天平往左倒的话,次品就只能是这些标号为1的情况,其他都被筛选掉了。标号为2则是天平往右倒,标号为3则是水平。
基于这个十字图,我们可以重新画出决策树。
上面的分析其实是有漏洞的,因为我们的目标只需要确定x,并不需要确定y。在13个物品问题上的决策树中,也存在知道哪个是次品,但不知道轻重关系的情况。
我们可以观察“次品在剩下的5个”时的情况,这个时候次品可能的状态数有10个,但只剩下2次称量了,也就是9种情况,10>9,理论上这个时候不可能称2次就能知道次品在哪。但问题就是,我们可以证明,这里总是有一个物品可以在不知道轻重关系的情况下,确定它是次品的(决策树上最左边的节点)。这样的话,情况数就是10-1=9,因此这个分析依然正确。
但这样的话,总的状态数变成了26-1=25了。那14个物品则是28-1=27,难道称3次就可以?答案依然是不行,这里的关键是,状态数允许,但操作不允许。
第一次称量的操作模式是固定的,那就是取出若干个进行测量,比如13个物品,取出8个物品,天平左右各放4个。你是不能像“次品在剩下5个时”那样,拿出其中3个和另外3个正品进行称量。对于14个物品来说,第一次称量可能的操作我们可以很简单地直接写完整: 1 v 1 ∼ 12 1v1\sim12 1v1∼12, 2 v 2 ∼ 10 2v2\sim10 2v2∼10, 3 v 3 ∼ 8 3v3\sim8 3v3∼8, 4 v 4 ∼ 6 4v4\sim6 4v4∼6, 5 v 5 ∼ 4 5v5\sim4 5v5∼4, 6 v 6 ∼ 2 6v6\sim2 6v6∼2和 7 v 7 ∼ 0 7v7\sim0 7v7∼0。我们拿出最有可能的 4 v 4 ∼ 6 4v4\sim6 4v4∼6和 5 v 5 ∼ 4 5v5\sim4 5v5∼4。 4 v 4 ∼ 6 4v4\sim6 4v4∼6中,如果进入了次品在剩下6个的分支,那么有6*2-1=11个状态,11>9是不行的。 5 v 5 ∼ 4 5v5\sim4 5v5∼4中,相对地,在 5 v 5 5v5 5v5这边有10个状态,10>9也是不行的。
更进一步说,我们需要一种操作恰好将14个物品的28个状态平分成9-9-10(9+1)个状态。显然 4 v 4 ∼ 6 4v4\sim6 4v4∼6和 5 v 5 ∼ 4 5v5\sim4 5v5∼4都不行,它们分别是8-8-12和10-10-8。但是,假如我们一开始有额外的正品,那么我们拿9个物品和9个正品进行称量( 9 v 9 ‾ ∼ 5 9v\overline{9}\sim5 9v9∼5),从下面的十字图可以看出,刚好平分成了9-9-10个状态。事实上,集合1和集合2都退化成了A类问题,而集合3就是13个物品时的“次品在剩下5个”的情况。
三元组
十字图其实还可以进一步简化,由于十字图中x轴是对称的,而y轴是非对称的,我们可以将一个十字图变成3个数字组成的三元组(a,b,c)。其中a表示确定y=0的物品个数,b表示确定y=1的物品个数,c表示不清楚y是什么的物品个数。下图是十字图和三元组的一些例子。
将状态转换成三元组后,推理的过程将变得十分简单,我们不妨将天平称量的所有操作用基于三元组的公式表达出来:
从上面的公式中,我们发现3个特点:
- 正常情况下(a,b)和c不可能同时非零,要不就是(0,0,c),要不就是(a,b,0)。
- (a,b,0)的情况下所有的操作都可以归纳成Mix操作。
- Mix操作相当于将a和b分别拆成了3个数字
- (a,0,0)相当于变成了A类问题。
我们使用这种方式重新画出了13个物品的决策树:
从该图可以轻松地看到,3次的称量共表示了25种情况,也就是13*2-1=25。
在三元组形式下,我们可以很容易地证明下面的结论:
在有额外正品的情况下,n次称量最多可以解决“ 3 n + 1 2 \frac{3^n+1}{2} 23n+1个物品中找次品的B类问题”。换句话说,就是n个物品,需要 ⌈ log 3 ( 2 n − 1 ) ⌉ \lceil \log_3(2n-1) \rceil ⌈log3(2n−1)⌉次称量。
证明很简单,我们只需要考虑 3 n + 1 2 \frac{3^n+1}{2} 23n+1个物品,它使用“Co 3 n − 1 3^{n-1} 3n−1”操作,分成( 3 n − 1 3^{n-1} 3n−1,0,0),(0, 3 n − 1 3^{n-1} 3n−1,0)和(0,0, 3 ( n − 1 ) + 1 2 \frac{3^{(n-1)}+1}{2} 23(n−1)+1)三个状态,前面两个状态退化成A类问题,最后一个状态其实就递归变成了 3 ( n − 1 ) + 1 2 \frac{3^{(n-1)}+1}{2} 23(n−1)+1个物品的问题。
然后我们再证明 3 n + 1 2 + 1 \frac{3^n+1}{2}+1 23n+1+1个物品,不可能只需n次称量。证明就用映射角度, 3 n + 1 2 + 1 \frac{3^n+1}{2}+1 23n+1+1个物品有 3 n + 2 3^n+2 3n+2个状态,而n次称量只能区分 3 n 3^n 3n个状态,因此不可能。
举个例子,有额外正品情况下,14个物品需要3次称量,41个物品需要4次称量。41个物品使用“Co 27”操作,分成(27,0,0)-(0,27,0)-(0,0,14)三个状态,前面两个退化成27个物品的A类问题,所以只需3次称量。最后一个其实就是14个物品的问题,所以也只要3次称量。因此41个物品只需要4次称量。而42个物品有42*2-1=83个状态,称量4次只能区分 3 4 = 81 3^4=81 34=81个状态,因此不可能。
解决B类问题
最后,我们需要回到起点,我们要证明,没有额外正品的情况下,n次称量最多可以解决“ 3 n − 1 2 \frac{3^n-1}{2} 23n−1个物品中找次品的B类问题”。换句话说,就是n个物品,需要 ⌈ log 3 ( 2 n + 1 ) ⌉ \lceil \log_3(2n+1) \rceil ⌈log3(2n+1)⌉次称量。要注意的是,上界 ⌈ log 3 ( 2 n + 1 ) ⌉ = ⌈ log 3 ( 2 n ) ⌉ \lceil \log_3(2n+1) \rceil=\lceil \log_3(2n) \rceil ⌈log3(2n+1)⌉=⌈log3(2n)⌉。
我们可以利用上述说的第三个特点,“Mix操作相当于将a和b分别拆成了3个数字”。所以我们只要保证拆出来的三个三元组,a+b的值尽量平均即可。
比如40个物品,在进行“Self 13”操作后,变成(13,13,0),(13,13,0)和(0,0,14)。(13,13,0)共有26个状态,26<27,因此理论上是可行的。注意到13/3是4.333……,我们可以将(13,13,0)拆成(4,5,0),(5,4,0)和(4,4,0),其实就是26=9+9+8,这样就可以保证这三个三元组的状态数最多是9。这样递归回去,就都可以拆成(1,0,0)或者(0,1,0),问题即可解决。
下面我们给出40个物品的决策树,而这个B类问题的严格证明我们就省略了。
后记
得出这些结论后,我去和前辈确认我们的思路是否一致。前辈说,我就是蒙的,状态数从n变成了2n嘛,那我就将 ⌈ log 3 ( n ) ⌉ \lceil \log_3(n) \rceil ⌈log3(n)⌉改成 ⌈ log 3 ( 2 n ) ⌉ \lceil \log_3(2n) \rceil ⌈log3(2n)⌉试试,结果发现AC了。