【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,写一段脚本,预先把要填的信息准备好,然后模拟点击按钮的动作 ...
随机推荐
- Python创建虚拟环境
用于创建和管理虚拟环境的模块称为 venv.venv 通常会安装你可用的最新版本的 Python.如果您的系统上有多个版本的 Python,您可以通过运行 python3 或您想要的任何版本来选择特定 ...
- vim文本编辑工具(全)
VIM文本编辑工具 编辑模式 i 在当前字符前插入I 在光标所在的行首插入a 在当前字符后插入A 在光标所在行尾插入o 在当前行的下一行插入新的一行O 在当前行的上一行插入新的一行 s ...
- 琴声不等式--jensen
(来自百度百科) 1. 凹函数,不加权 2. 凹函数,加权 3. 凸函数,不加权 4. 凸函数,加权 应用 在EM算法Q函数的推导中,用到了第二个不等式(凹函数,加权)
- JavaScript中数组中遍历的方法
前言 最近看了好几篇总结数组中遍历方法的文章,然而"纸上得来终觉浅",决定此事自己干.于是小小总结,算是自己练手了. 各种数组遍历方法 数组中常用的遍历方法有四种,分别是: for ...
- iOS - Bundle 资源文件包生成和常见资源文件使用
1.Bundle 文件 Bundle 文件,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是静态的,也 ...
- 使用sqlyog创建数据库的错误
1.错误代码: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL s ...
- Merge join、Hash join、Nested loop join对比分析
简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...
- mybatis 原理
什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- BATA冲刺准备
目录 第一部分 调研,评测 福大助手的bug IOS端 Android端 福大助手结构体系的思维导图 为什么开发人员没有发现这个bug 假设团队开发这款app,应注意哪些方面(架构.部署运维.微服务等 ...
- static作用(修饰函数、局部变量、全局变量)
转自:http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作 ...