【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,写一段脚本,预先把要填的信息准备好,然后模拟点击按钮的动作 ...
随机推荐
- jmeter功能按钮介绍
Jmeter本来是做性能测试的,所以有很多监听器都是针对性能的,随后边的不断发展,可以应用到接口自动化等测试工作上. 面板的文件菜单中一般都是打开.保存.新建测试的,如下图: 保存时可以直接ctrl+ ...
- python实现atm机基本操作及购物车
一.需求分析 ATM机要为用户提供转账,提现,还款,付款,消费流水,操作记录等操作接口 ATM机要为管理员提供创建用户,冻结解冻,修改额度的功能 ATM机管理员认证使用装饰器来实现 购物车要提供管理员 ...
- tty命令详解
基础命令学习目录首页 原文链接:http://blog.chinaunix.net/uid-9525959-id-2001836.html [功能] 打印连接到标准输入的终端的文件名. [描述] ...
- iOS 静态库 与 demo 联合调试
在修复bug或者开发静态库需要调试,这个时候需要把工程中的.framework和资源bundle文件都替换为静态库原工程文件 首先需要确保静态库工程文件没有打开,Xcode不允许在两个地方同时打开同一 ...
- Apache 工作模式的正确配置
prefork work event
- 20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有 ...
- Task 4.3 求环形数组的最大子数组和
任务要求:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n- ...
- 项目Beta冲刺(团队)第六天
1.昨天的困难 可以获得教务处通知栏的15条文章数据了,但是在显示的时候出了问题. 私信聊天的交互还没研究清楚 2.今天解决的进度 成员 进度 陈家权 研究私信模块 赖晓连 研究问答模块 雷晶 研究服 ...
- visualStudo编译c程序, 提示函数unSafe问题
问题描述: 在利用visualStudo进行C语言编程时,若C语言源程序中有print,freopen等函数时,IDE软件总是unSafe,而且无法通过编译. 解决方案: 在<视图>中找到 ...
- java常见字符集
ASCII 名称由来 ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于罗马字母表的一套电脑编码系统.[1] ...