View
34
Download
0
Category
Preview:
Citation preview
BZOJ19623
什么是猜数问题?
预先存在一个数
限制条件:
1. 猜错(小)次数有限
2. 得到反馈存在延迟
3. …
4
模型王子
TL 家有无数个高达机器人的模型,这已经不是一个秘密。终于有一天,你忍不住了,问 TL:你家到底有多少个模型呢?
TL:就是不告诉你。 You:说吧说吧,别保密了咯,我不会让老师知道的。TL:这样吧,我让你猜,你每次猜一个数,我会告诉你比这个数大还是小。
你快点猜出来,我马上就要去奶奶家吃饭去了。你以你的打字速度每 1s 可以提一个问题,但是由于该遭天杀的网络延迟。
TL 的回答要在 1s 之后才会传到你这里来。也就是说,只有当你提出了下一个问题之后,这个问题的答案才会告诉你。
同时,由于 TL 心高气傲。如果你低估他拥有的模型数量,他就会生气。如果你低估了他 K(1<=K<=100)次,他就不再陪你玩了。你最开始已经知道,TL 的模型数量至少有 1 个,至多不超过 N(1<=N<=105)个。下面是一个 N=6 时的可能的询问过程:
BZOJ1962 5
BZOJ1962 6
简单的模型
被猜数 X 是 1 到 N 范围内的整数,每次你可以询问一个整数 Y 和 X 的大小关 系。给出 N,请问在最坏情况下至少需要几次才能保证猜出 X。
二分
不是简单的
7
建立模型
f(i):表示询问i次可以处理长度为i的区间
f(i) = f(i – 1) + f(i – 1) + 1 = 2f(i – 1) + 1
8
复杂度?
目测是O(Ans).
观察f(i)的增长速度快于指数函数,故:
O(Ans) = O(log2N)
抽象化,便于分析
9
限制一
基本设定不变,如果你得到了K次以上X > Y的回答,那么你就失败了,当然你是不会允许失败的。
二分GG T_T
f(i,j)表示询问了i次得到了j次X > Y的回答游戏就会结束的情况下能处理的区间长度
10
11
f(i,j) = f(i – 1,j) + f(i – 1,j – 1) + 1
f(0,j) = 0, f(i,0) = 0
复杂度? O(Ans)?
跟组合数递推公式对比,易知f的增长速度是非常快的
12
限制二
基本假设不变,现在你每问出一个问题之后,不会
马上得到结果。再你猜下一个数之后会告诉你第一个的结果。
两个区间的等价性
f(i)意义不变
13
14
f(i) = f(i – 1) + f(i – 2) + 1
易知f(i)的增长速度比Fibonaci
数列更快,所以复杂度是很优的。
15
限制一+限制二
背景就是三个背景叠加
f(i,j)表示意义同限制一
区间已经不等价了!
16
第二次询问落在小于Y的区间
17
第二次询问落在大于Y的区间
18
f(i,j) = max{f(i – 1,j) + f(i – 2,j –2),f(i – 2,j) + f(i – 1,j – 1)} + 1
复杂度?
(随便感受一下就知道很快
19
简单变形
某游戏厅有一个硬币游戏机,游戏的基础就是最普通的猜数游戏。你猜一个数 Y,然后机器告诉你猜对了或者比目标数 X 大还是小。如果你猜对了,游戏直接结束,如果你猜的数比 X 大,你就需要投入a 枚硬币让游戏继续,如果你猜的数比X 小,你就需要投入 b 枚硬币让游戏继续。已知X 是 1 - N 里面的数。N 已知, 请问需要多少枚硬币才能保证猜出 X?
f(i) = f(i – a) + f(i – b) + 1
20
更大的挑战
被猜数X 是1到N 范围内的整数,每次你可以询问一个整数 Y 和 X 的大小关系。不同于普通猜数问题,本次提问的回答你不会马上得到,也不是在你下一次提出问题后,而是在你再提问C 次之后才告诉你。也就是你每问一个问题之后, 得到的回答是之前第C次提问的答案。给出 N、C,请问在最坏情况下至少需要几次才能保证猜出 X?
套用以前的分析方法?
sgu 21
不可行
这C次盲目猜测有2^c种情况,那种式子需要取这所有情况的最大值,GG
打个表冷静一下
发现了些什么…… 决策都在极端情况
不妨全猜更大的数
f(i) = f(i – 1) + f(i – c – 1) + 1
就这么AC了
Sgu22
怎么证明呢?
非常遗憾,我也不会…
有兴趣的同学可以课下研究
23
Q & A
24
Thank you!
25
Recommended