bzoj2523CTSC2001聪明的学生

Posted scx2015noip-as-php

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2523CTSC2001聪明的学生相关的知识,希望对你有一定的参考价值。

 真是神仙题,做完后感觉智商提(jiang)升(di)了

 这种题一般都是把局面设成状态,然后发现可以由一种状态转移到另一种状态,那就是 $dp$ 了。

 但是这道题怎么设呢?

 

 题目中给了你一个结论,一般题目给的信息都不会没用,这题的结论就很有用 —— 一定是数最大的那个人先猜出来

 随便枚举几个例子,你会发现一个有趣的特殊情况:设一个人看到另外两人的数分别为 $x,y(x\ge y)$,若 $x=y$,那这个人就直接猜出来自己的数了。

 因为这个人的数只可能是 $x-y$ 或 $x+y$,而题目说了三个人贴的都是正整数,所以如果 $x-y=0$ 的话,这个人就知道了他的数不是 $x-y$,而是 $x+y$。

 那 $x≠y$ 的情况呢?

 根据题目给的结论,每个人会先假设自己是 $x-y$,然后某个人会在某一轮确定自己不是 $x-y$ 而是 $x+y$,从而说出“知道”。

 我们考虑在什么情况下,一个人会最先说出“知道”。

 这个人说“知道”显然只和前两轮另外两人的回答有关系(如果能通过再之前的回答确定,那他上一次回答就会说“知道”了)。

 结合题目给的结论,可以得知关键就在于另外两人中数大的那个人上次的回答。这个人能确定自己不是 $x-y$ 而是最大值 $x+y$,当且仅当那个人在是最大值的情况下,应该在上一次回答说“知道”,但那个人没说。只有这样才能确定那个人不是最大值,而那个人是另外两人中的最大值,那么自己就一定是最大值,即 $x+y$ 了。

 看!局面状态是可以转移的!

 设状态为三个人的数组成的三元组,记录的值为最大值应该在第几轮说“知道”,那显然可以由 $(x,y,x-y)$ 转移到 $(x,y,x+y)$,转移贡献就是 $+1$ 或 $+2$(取决于最大值是前面第几位)。我写的三元组是无序的,实际上写代码时应该有序,顺序为(上上个人的数,上个人的数,这个人的数)。

 终止状态就是一开始想到的那个特殊情况:如果另外两个人的数相等,那这个人第一次回答就是“知道”,返回这个人是第几个被提问的就行了($[1,3]$ 内的整数)。

 

 事实上你写出代码之后,会发现并不用记这个人的数,只需要记这个人是哪个人就行了。因为转移只与另外两人的数有关系。

 还有就是请写裸的搜索,不要写 $dp$/记忆化搜索,因为状态的前两维(另外两人的数)的值域都是 $[1,M]$,$M$ 是 $3e4$ 的,你开不下 $dp$ 数组。

 时间复杂度就很玄乎了,可能智商题都不用太管时间复杂度吧。

 代码

 提交时间不错啊

以上是关于bzoj2523CTSC2001聪明的学生的主要内容,如果未能解决你的问题,请参考以下文章

[CTSC2001]1378 选课

bzoj 2542: [Ctsc2001]终极情报网 费用流

Lync 项目经验-45-用培训课件当运维文档,聪明

跟聪明人交流真愉快

图论(网络流):[CTSC2001]终极情报网

bzoj4896 补退选