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

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

但是这道题怎么设呢?

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

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

因为这个人的数只可能是 $x-y$ 或 $x+y$,而题目说了三个人贴的都是正整数,所以如果 $x-y=0$ 的话,由于 $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$ 数组。

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

代码

提交时间不错啊

【bzoj2523】【CTSC2001】聪明的学生的更多相关文章

  1. [BZOJ2523][Ctsc2001]聪明的学生

    [BZOJ2523][Ctsc2001]聪明的学生 试题描述 一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A,B和C.有一天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸条并告诉他 ...

  2. BZOJ2523/LOJ2646 聪明的学生

    BZOJ2523/LOJ2646 聪明的学生 第一道CTSC的题. 因为是思维题,所以思路就不写了.直接看代码吧. #include<bits/stdc++.h> #define M 30 ...

  3. bzoj2523 聪明的学生

    bzoj第一题,ctsc2001. 黑书上的递归例题,我们定义time()函数,递归求解即可. 这个题用到了一个小技巧:可以使用枚举来搞算法. #include <iostream> #i ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ 刷题总结(持续更新)

    本篇博客按照题号排序(带*为推荐题目) 1008 [HNOI2008]越狱 很经典的题了..龟速乘,龟速幂裸题,, 1010 [HNOI2008]玩具装箱toy* 斜率优化 基本算是裸题. 1012 ...

  6. *HDU1847 博弈

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. 探索性思维——How to Solve It

    我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到 ...

  8. [转] ACM中国国家集训队论文集目录(1999-2009)

    国家集训队1999论文集 陈宏:<数据结构的选择与算法效率——从IOI98试题PICTURE谈起>来煜坤:<把握本质,灵活运用——动态规划的深入探讨>齐鑫:<搜索方法中的 ...

  9. 【原创】我是怎么从零开始教女同学进行php开发的(4)

    周末给自己放了一个小假,周五晚上跟同学出去吃饭,周六又休息了一天,直到周日才坐到电脑前面码字. 本来说好周末这两天把之前三篇的代码根据评论中的建议好好修改一下的,顺便认真系统地学习一遍HTML基础.结 ...

随机推荐

  1. 通过正则把文本里的链接加上a标签

    把文本里的链接替换成a标签 function addLinks($text) { return preg_replace('/(http[s]?:\/\/[A-Za-z0-9]+\.[A-Za-z0- ...

  2. docker镜像的仓库

    一.docker镜像的仓库 --- repos-registry的创建: 仓库分为公共仓库和私有仓库 DockerHub的官方仓库 https://hub.docker.com DockerPool社 ...

  3. SparkCore的性能优化

    1.广播变量 1.1. Spark提供的Broadcast Variable,是只读的,并且在每个节点上只会有一份副本,而不会为每个task都拷贝一份副本 1.2.它的最大作用,就是减少变量到各个节点 ...

  4. react navigation goBack()返回到任意页面(不集成redux) 一

    方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...

  5. MATLAB2014b parpool 报错,并行工具无法开启解决方法

    笔者一直在用matlab2014b,第一次使用并行工具parpool,但在运行别人的程序的过程中一直出现一个错误: Starting parallel pool (parpool) using the ...

  6. Tomcat开机自启动,通过服务名重启

    1.将Tomcat注册为服务2.服务开机自启动3.修改Tomcat进程名(待补充)4.通过命令查看日志,不需要进入到日志目录(待补充)5.tomcat进程守护(待补充) 1. 安装tomcat, 此处 ...

  7. 第一次实验报告&学习总结

    实验报告一&学习总结 一.实验目的 熟悉JDK开发环境 熟练掌握结构化程序设计方法 二.实验内容 打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例 ...

  8. PTA(Basic Level)1032.挖掘机技术哪家强

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数.随后 N ...

  9. Oacle常用语句

    1.建表语句 ) NOT NULL, region_id ) NOT NULL, salesperson_id ) NOT NULL, ) NOT NULL, ) NOT NULL, tot_orde ...

  10. java 8 date time 简单样例

    参考 Java 8 Time Api 使用指南-珍藏限量版 Java 8 中处理日期和时间示例 部分样例 import java.time.temporal.TemporalAdjusters; im ...