题目
传送门。
算法
以下描述都举这个例子:\(x\)是\(11\),\(y\)是\(5\)。
算法1
把\(x\)和\(y\)化成二进制,最多\(10\)位,那么\(x=1011_2\),\(y=0101_2\)。比较它们不同位,把不同位最低位(最大是\(9\))和\(x\)是多少告诉B,上面的例子要告诉B:第\(2\)位不同,\(x\)第二位为\(1\)。那么,\(H_{max}=9*2=18\)。
算法2
仍化成二进制,这次告诉B的是:不同位且\(x\)的那一位为\(0\)的最低位,如果没有,容易知道\(x\)的\(0\)的个数不等于\(y\)的\(0\)的个数,那么这里把\(x\)的\(0\)的个数和\(x\)的\(1\)的个数取最小值(最大是\(5\))告诉B。那么\(H_{max}=10 +5=15\)。
算法3
对于每对\((x,y)\),A都要说出一个\(H\),那么就可以把每对\((x,y)\)分为若干组,使得在同一组(看作集合\(S\))内这种情况不会发生:存在\(a,b,c\in S\),有\((a,b)\)和\((c,a)\)。
好吧,怎样分组我还真不知道。
算法4——解答
前面都是我乱想的,其实算法3是从A出发,解答是从B出发:对于每对\((q,H)\),B都要说yes
或no
。那么设集合\(S_q={H_1,H_2,...H_m}\),如果\(H\in S_q\)那么就回答yes
,否则no
。
对于A来说,如果有\(x,y\),那么他可以告诉B:\(\forall H \in S_x \setminus S_y\),这样子,我们就需要保证任意集合没有包含关系。最佳的选择是,从\(12\)个元素里任意选\(6\)个,每种选法作为一个集合,那么我们就可以生成\(C_{12}^6=926>920=N\)个集合了。
想法——结合算法3&算法4
其实算法3和算法4是等价的,只不过算法3应该如何分组我想不出来。
如果算法3的分组方案十分困难,那么就可以出一道很难的题了(2333):这需要考察选出问题转化的能力。
对于\(N=6\)的情况,依照算法4推出算法3的一种分组方案:
行是\(x\)的值,列是\(y\)的值,格子的值是\((x,y)\)属于哪一组。
希望有高人指点一二:按照算法3的思路应该如何分组?