题目链接

IOI的签到题感觉比NOI的签到题要简单啊,至少NOI同步赛我没有签到成功……

其实这个题还是挺妙妙的,如果能够从题目出发,利用好限制,应该是可以想到的做法的。

接下来开始讲解具体的做法:

题目中有一个重要的限制就是答案序列首字母不会出现多次,这意味着当我们知道首字母后,接下来序列中的候选字符就只剩下$3$个了,以及我们可以在一个询问中用首字母来分割多个你想要知道的字符串。

很显然我们可以用二分找到首字母,这将花费$2$次询问机会。方便起见,我们把首字母定为$a$,剩下的$3$个字符分别为$b,c,d$。

剩下还有$n-1$个位置,通常的思路就是逐位确定。

假设我们已经找到了答案的前$i$位组成的字符串是$ans$,我们考虑怎么确定第$i +1$位是什么。

朴素的方法可以试$2$次,每次就是询问$ans+b$和$ans+c$,就能知道下一个字符是什么了。

但我们发现,题中限制每次询问的长度不超过$4n$,显然朴素的方法有点浪费。我们考虑能不能一次询问多个字符串使得把$2$次询问合并在一起呢?

这个思路是可行的,我们可以在一次询问中放入$4$个字符串:$ans + b + b + ans + b + c + ans + b + d + ans + c$,由于首字母只出现一次,所以我们询问的四个串的答案是分开算取$max$的。我们发现如果下一位是$b$,那么应该为返回$i + 2$,如果下一位是$c$,那会返回$i + 1$,否则就会返回$i$,我们用恰好$4n$的长度在一次询问里区别了三个字符。

有一个小问题要注意,如果$i = n - 1$时,按照上述做法会超出$4n$的长度限制,故结尾处需要用$2$次询问。

总的询问次数就是$2 + n - 2 + 2$,共$n+2$次,刚好达到题目的限制。

给出需要实现的函数:

#include "combo.h"
#include <algorithm>using namespace std;string guess_sequence(int n) {string p = "", ans = "";char a, b, c, d;if (press("AB") > 0) {c = 'X', d = 'Y';press("A")? (a = 'A', b = 'B') : (a = 'B', b = 'A');} else {c = 'A', d = 'B';press("X")? (a = 'X', b = 'Y') : (a = 'Y', b = 'X');}ans = a;if (n == 1) return ans;for (int i = 1; i < n - 1; ++i) {p = ans + b + b + ans + b + c + ans + b + d + ans + c;int bk = press(p);if (bk == i + 0) ans += d;if (bk == i + 1) ans += c;if (bk == i + 2) ans += b;}if (press(ans + b) == n) ans += b;else if (press(ans + c) == n) ans += c;else ans += d;return ans;
}

View Code

转载于:https://www.cnblogs.com/Dance-Of-Faith/p/9649292.html

【IOI 2018】Combo 组合动作(模拟,小技巧)相关推荐

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

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

  2. 【搞定CAD】键盘“组合键”应用小技巧

    今天来说一说组合键在CAD中的应用 选择性记忆某些命令的组合快捷键 可以提高操作速度 举个栗子:相切相切相切画圆快捷键? C-3P-tan拾取点-tan拾取点-tan拾取点 或者常规方式:直接点图标 ...

  3. Android TV开发焦点动作控制小技巧

    为什么80%的码农都做不了架构师?>>>    焦点移动,前一个拥有焦点的view如果在接收到key事件时,key监听消耗掉事件,也就事件不能往下传递了,此时在return true ...

  4. 2018.10.24 NOIP模拟 小 C 的序列(链表+数论)

    传送门 考虑到a[l],gcd(a[l],a[l+1]),gcd(a[l],a[l+1],a[l+2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l+1]),gcd(a[ ...

  5. My winning theory in IOI 2018 2019 — Why I won 2 golds in IOI

    总目录详见https://blog.csdn.net/mrcrack/article/details/103564004 摘自https://codeforces.com/blog/entry/691 ...

  6. 搜索引擎的小技巧【可以组合起来使用】:

    ■ 注意细节:冒号是英文的冒号 一.搜索引擎的小技巧 (1)排除干扰项,减掉干扰项的关键词      关键词 -干扰项的关键词 (2) 想在特定的网站进行搜索,通过site:网站       关键词 ...

  7. 算是我看源码时的一个小技巧吧~

    我在之前的文章里面不是经常叫大家拉源码,然后看代码提交记录吗. 也就是看类似于这个界面: 比如上面这个界面中,就可以看到 RedissonBaseLock.java 这个文件,由谁在什么时候进行过变更 ...

  8. python写出的程序如何给别人使用-涨姿势!这些小技巧让小白也可以写出更优雅的Python代码!...

    原标题:涨姿势!这些小技巧让小白也可以写出更优雅的Python代码! 一.前言 我前两天回答了两个Python相关的问题,收到了很多赞,从答案被收藏的情况来看,确实对不少人都很有帮助,所以我也很开心. ...

  9. 鸟哥的Linux私房菜(基础篇)-第四章、安装 CentOS 5.x 与多重开机小技巧

    第四章.安装 CentOS 5.x 与多重开机小技巧 最近更新日期:2009/08/11 Linux distributions越作越成熟,所以在安装方面也越来越简单!虽然安装非常的简单,但是刚刚前一 ...

  10. 什么是mac os?它有哪些好的特点?有哪些应用小技巧

    基本信息 Mac系统是苹果机专用系统,是基于Unix内核的图形化操作系统,一般情况下在普通pc上无法安装的操作系统. 苹果公司不但生产MAC的大部分硬件,连MAC所用的操作系统都是它自行开发的,接下来 ...

最新文章

  1. [转]在Eclipse中使用JUnit4进行单元测试(中级篇)
  2. iOS实录15:浅谈iOS Crash
  3. windows 8 修改文件权限
  4. C++知识点60——非类型模板参数
  5. matlab矩阵转入tecplot,利用Tecplot导入MATLAB计算结果数据进行三维可视化
  6. ASP.NET Core微服务(六)——【redis操作】
  7. libsvm与python的使用
  8. 【Idea解法】Failed to execute goal on project : Could not resolve dependencies for pro
  9. 车辆入库java程序_java扫描入库及出库,基于谷歌类开发.仅提供完整代码 连接SQL使用,...
  10. r和matlab学哪个,初学者求教‘r*’是什么意思啊
  11. 总结深度学习各种网络结构【更新中...】
  12. ZooKeeper 典型应用场景有哪些?
  13. myeclipse8.5打包jar并引入第三方jar包
  14. Java Lambda 表达式快速学习
  15. galleryview-3.0b3使用小记
  16. oracle odi的使用,Oracle ODI 使用
  17. CF855G. Harry Vs Voldemort(边双,并查集,dp)
  18. 【网络安全系列】之新型勒索病毒WannaRen疑在国内大规模传播,威力不亚于新冠
  19. 无接触招聘,AI催生HCM SaaS新动向
  20. MATLAB遗传算法工具箱安装包及安装方法(图解)

热门文章

  1. ROS入门(十)——两只小乌龟(乌龟跟随C++实现)
  2. LeetCode-Hot100-最长回文子串
  3. Java将文件转换成二维码
  4. about-page
  5. Polish calculation
  6. 路由2台,二层交换机4台,三层1台,实现网络互联
  7. 三相全桥整流电路_什么是三相桥式全控整流电路,三相桥式全控的工作原理是什么,三相桥式全控电路电路图...
  8. echarts实现左右滑动
  9. 外牌年检车辆在上海办理年检
  10. IJCAI 2022 | 求同存异:多行为推荐的自监督图神经网络