【IOI 2018】Combo 组合动作(模拟,小技巧)
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") > ) {
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 == ) return ans;
for (int i = ; i < n - ; ++i) {
p = ans + b + b + ans + b + c + ans + b + d + ans + c;
int bk = press(p);
if (bk == i + ) ans += d;
if (bk == i + ) ans += c;
if (bk == i + ) ans += b;
}
if (press(ans + b) == n) ans += b;
else if (press(ans + c) == n) ans += c;
else ans += d;
return ans;
}
【IOI 2018】Combo 组合动作(模拟,小技巧)的更多相关文章
- 2018.10.24 NOIP模拟 小 C 的宿舍(分治)
传送门 分治妙题. 没有这道题的暴力分今天又垫底了啊233 由于用了分治的方法,我们只用考虑左区间对右区间的贡献以及右区间对左区间的贡献. 可以发现如果从中点开始向两边递推最小值并用这个区间最小值来推 ...
- 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[ ...
- 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)
传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...
- Android简易实战教程--第二十二话《自定义组合控件模拟qq登录下拉框和其中的一些”小技巧”》
转载此文章请注明出处:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52313516 首先,很荣幸此专栏能被CSDN推荐到主页.荣 ...
- Fiddler-010-网络延时应用小技巧-模拟低网速环境
在日常的网络测试中,经常需要测试网络超时或在网络传输速率不佳的情况的应用场景,而与此同时我们有时手边资源有限,实现在各种真实网络(2G\3G)环境下测试有些局限性.其实 fiddler 已经提供了类似 ...
- 微信抢红包小技巧(python模拟100万次)
之前,在网上看到一篇文章,说多人抢红包时,微信红包金额的分配规则是0.01元到当前剩余金额平均数的2倍(最后一个人金额为当前剩下的所有金额),所以写了一个python程序,模拟量一百万次,分析了一下抢 ...
- CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅
首页 登录注册 CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅 阅读 8113 收藏 927 2017-09-26 原文链接:github.com 腾讯云容器服务CSS,立 ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- javascript自动填写表单小技巧
javascript自动填写表单小技巧 在平时开发过程中,或者在访问某些站点,经常要频繁地填写一大堆表单时,我们可以利用javascript,写一段脚本,预先把要填的信息准备好,然后模拟点击按钮的动作 ...
随机推荐
- Hyperledger Fabric 1.0.1至Hyperledger Fabric 1.0.5所升级的内容及修复的问题
基础更新 各版本每次迭代都会有一些基础更新内容,如文档修改覆盖.测试用例完善.用户体验改进及删除冗余无效代码等… 下面分类介绍的是一些版本迭代的重要更新内容,因个人实操和理解有限,部分更新并未明确,如 ...
- 重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 本文经授权转载自 FreeBuf 2018年世界杯硝烟散尽,但关于她的话题却远远没有结束.说起世界杯,就 ...
- GlusterFS分布式存储集群-2. 使用
参考文档: Quick Start Guide:http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Quickstart/ Instal ...
- vi/vim命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...
- Python20-Day07
面向对象之继承与派生 什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又称为基类或者超类,新建的类称为派生类或者子类 子类会‘遗传’父类的特性,从而解决代码重用问题 py ...
- so easy, too happy
一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 • Estimate • 估计这个任务需要多 ...
- Linux基础入门--04
目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...
- Spring笔记③--spring的命名空间
p:命名空间: xmlns:p="http://www.springframework.org/schema/p" 作用:简化在xml配置bean的属性 在<bean> ...
- 浅谈对IT的认识!
我是一个从农村出来的学生,家里的情况和大多数的农村同学是一样的,家里算不上有钱,父母供我读书,也已经是做到仁至义尽了. 我现在选了,一个和计算机有关的专业---计算机应用技术.就是希望毕业后,可以找到 ...
- 关于echart柱形图的使用问题
关于一个数据对应两个值的问题 series: [{ name: '数量(个)', type: 'bar', barWidth: '30%', barGap: , //两个数据条没有间距 data: y ...