CEOI2014 day1 task3 Question

题目

传送门

算法

以下描述都举这个例子:\(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都要说yesno。那么设集合\(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)\)属于哪一组。
CEOI2014 day1 task3 Question

希望有高人指点一二:按照算法3的思路应该如何分组?

上一篇:聊一聊 tcp拥塞控制 fack


下一篇:【2021蓝桥杯省赛】双向排序