还是自己水平不够,想了两天没想出来……(然后我就被其他人吊打了)

这种题目看了题解就秒会,自己想就想不出来……

下面是我的心路历程(我就在想出来又叉掉的不断循环中度过……)

开始把题目看成了查询限制 \(2N\) 长度,然后怎么也不会做,看看题,发现是 \(4N\) (然而还是不会做)

首先一个很显然的想法,就是先两步找出第一个,然后后面的每个都用一步。最后一位可能要多耗费一个。此时总步数正好是 \(N + 2\)。

然后重点就在中间的了。

我们记剩下来的字符为 \(A, B, C\),当前处理好的字符串为 \(S\)。

首先很容易有一个想法:在一个串后面加一堆同一个字符,然后看增加了多少,这样有概率一下子增加多个。

如果把所有连续的长度求出来,那么每次枚举只有两种情况,貌似很优秀。

于是构造 \(\{ S + A + \dots, S + B + \dots\}\),发现没填满,应该不对,于是改成 \(\{ S + A + A + \dots, S + A + B +\dots, S + B + A + \dots, S + B + B + \dots \}\) 。

然后发现对于下面是 \(A\) 和 \(B\) 的都很好求,只要分类讨论增加了几个。

但是一旦有 \(C\) 就会有额外枚举量,所以这种想法放弃了。

接着考虑如果不求最长连续的,对三种情况暴力算的也许可以。比如说可以改成不断的求子问题的模型。

仔细分析发现这样做本质和每次只增加 \(O(1)\) 个字符是相同的。

所以考虑每次增加那么多。

接下来我类似地考虑了这个加同一个字符。

也就是询问 \(\{ S + A + A + A, S + A + B + B, S + B + A + A, S + B + B + B \}\)

显然也可以通过分类讨论加了多少个的情况。

对于没加的;显然是 \(C\),对于加了 \(1\) 的,枚举第一位就可以知道第 \(2\) 位;对于加了 \(3\) 的,显然可以查询两次得到。对于这几种情况,得到每一个的耗费都是 \(1\)。

然而这个做法还是挂在加了 \(2\) 的,冷静分析,发现直接确定第三位还是更优的,但是马上发现你要用两步确定 \(8\) 种情况,然后GG。

所以发现我的做法对于只增加了两个的都凑不出来(总会多一步)。

凑了那么多,发现最后还是要找一个对于所有位数,情况平均少一点的。但是有一个 \(3\) 就显得难做了。


直到我看了题解:

我的做法太贪了,一次确定多位不太行,没有去想一次只确定一位……(这个故事告诉我们,做题尽量由浅入深,从简单的开始考虑)

和分类讨论加了多少个的思想类似,这个十分的暴力……

直接把下一个是 \(A\) 就 \(+2\), 是 \(B\) 就 \(+1\), 是 \(C\) 就 \(+0\),显然这个很好构造 \(\{ S + A + A, S + A + B, S + A + C, S + B\}\)

显然满足。

然后注意对剩下的只有一个的特判,正好补上最后的多的一个。

然后我把 \(<\) 写成 \(\leq\),WA了一发……

#include "combo.h"const char sx[] = {'A', 'B', 'X', 'Y'};
std::string S, li[3];
std::string d(int at) {return at == 3 ? S : li[at];
}
template<typename ... T>
std::string d(int at, T ... args) {return (at == 3 ? S : li[at]) + d(args...);
}
std::string guess_sequence(int N) {char fir = press("AB") >= 1 ? (press("A") ? 'A' : 'B') : (press("X") ? 'X' : 'Y');S += fir; int bx = 0;for (int i = 0; i < 4; ++i)if (sx[i] != fir) li[bx++] = std::string(1, sx[i]);for (bx = 1; bx < N; ) {std::string qry;if (bx + 1 == N) {S += press(d(3, 0)) == N ? li[0] : (press(d(3, 1)) == N ? li[1] : li[2]);break;}int res = press(d(3, 0, 0, 3, 0, 1, 3, 0, 2, 3, 1)) - bx;if (!res) S += li[2];else if (res == 1) S += li[1];else if (res == 2) S += li[0];++bx;}return S;
}

转载于:https://www.cnblogs.com/daklqw/p/11587206.html

【IOI2018】组合动作相关推荐

  1. 【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)

    一.缓冲动作 在实现运动中,常常需要一些加速度或者减速度的效果.Cocos2D-X引擎为我们提供了相应的实现接口,这样就不用再用原来的公式计算方法来实现加减速的效果.      Ease系列的方法改变 ...

  2. Cocos2d-x制作跳棋第四步:胜负判断、AI具体实现及实现特殊组合动作的小技巧

               上周讲了Cocos2d-x 制作跳棋中棋子各种动作的实现以及跳棋AI思想的分      享,这次跟大家分享跳棋胜负判断和AI具体代码实现.               一.  胜 ...

  3. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  4. Cocos2D-x(3)——动作类备忘

    1. CCAction是cocos2d-x中的动作类,继承自CCObject,动作类必须依托与CCNode及其子类对象来发回作用.CCAction的子类包括有限时间动作CCFiniteTimeActi ...

  5. cocos2d笔记 (4)cocos2d里的各种动作

    通常调用某个动作的方法:  // 创建动作id actionTo = [CCMoveTo actionWithDuration: 2 position:ccp(s.width-40, s.height ...

  6. IOI2018退役记 + NOIP2018游记

    Day1 在空中感受了一下日本的特别高的森林覆盖率,在机场感受到了家乡的感觉(中文似乎作为第三语言),过海关的时候感受到了对面说英文我听不懂口音,说中文我以为在说英文的无力.. 认识了向导,据说878 ...

  7. Unity实战之牧师与魔鬼(动作分离版)

    Unity实战之牧师与魔鬼(动作分离版) 项目链接 整体描述 本次项目在第一版牧师与魔鬼的基础上,将动作从场记中分离出来,并设计一个裁判类实时监测游戏进行的情况.这样改进的优点有很多: 降低了不同功能 ...

  8. 魔鬼与牧师动作分离版

    关于动作分离.可以通过对游戏对象增加可执行的动作,可以划分出很多的基础动作,如上船,下船,前进后退等.所以我们可以通过提取基础动作,然后使用类的方法来执行游戏对象的动作,同时通过配备动作管理者,让其去 ...

  9. 牧师与魔鬼 -- version2 动作分离

    目录 一.基本操作演练 1.下载 Fantasy Skybox FREE, 构建自己的游戏场景 2.写一个简单的总结,总结游戏对象的使用 二.编程实践 1.牧师与魔鬼 动作分离版 面向对象的游戏编程 ...

  10. Unity牧师与魔鬼小游戏(动作分离版)

    Unity牧师与魔鬼小游戏(动作分离版) 前言 这是中大计算机学院3D游戏编程课的一次作业,在这里分享一下设计思路. 主要代码上传到了gitee上,请按照后文的操作运行. 项目地址:https://g ...

最新文章

  1. python可视化来分析全国疫情
  2. python环境管理命令_conda管理Python环境
  3. c语言程序设计输入c,C语言程序设计(计算输入字符)
  4. workflow and email in QD3 - IS_INBOX_USER method
  5. java生日正则表达式_java之正则表达式、日期操作
  6. JSP的9个内置对象-session
  7. mysql cluster 乱码_Mysql中文乱码问题完美解决方案
  8. 使用webstorm操作git
  9. 源码分析 Mybatis 的 foreach 为什么会出现性能问题
  10. CentOS 7完全卸载MySQL
  11. Arduino AFMotor 电机扩展板概述
  12. 手机上使用油猴插件 Tampermonkey
  13. latex插入参考文献技巧
  14. python 前缀和总结
  15. HDU 5698 瞬间移动 (2016百度之星 - 初赛(Astar Round2B) 1003)
  16. linux pvdisplay PE,linux中的pvmove,pvremove,pvs,pvscan
  17. sparkStreaming常见问题
  18. 小程序开发之全栈开发(一)
  19. 一个遮罩层怎么遮罩两个图层_遮罩效果全解(13种方法)
  20. 这些年,我与Google不得不说的那些事儿

热门文章

  1. [导入]【沈殿霞张曼玉经典爆笑鬼片】《双肥临门》【国语DVD中字】
  2. win10无法启动_常见的电脑故障分析:win10系统无法启动,造成的原因及解决教程...
  3. 程序员可以通过软考来办理北京户口,成为北京人
  4. 微信公众号文章音视频下载的几种办法-涵盖PC端和手机端
  5. 2023计算机毕业设计SSM最新选题之javaJava班级信息管理系统x0w9c
  6. sap采购定价过程配置
  7. SAP采购中若干价格表的梳理
  8. windows系统IIS服务安装
  9. 利用MATLAB视频函数工具箱的…
  10. 操作系统文件系统练习题