博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF1103B]Game with modulo
阅读量:5100 次
发布时间:2019-06-13

本文共 1108 字,大约阅读时间需要 3 分钟。

题目大意:交互题,有一个数$a(a\leqslant10^9)$,需要猜出它的值,一次询问为你两个数字$x,y(x,y\in[0,2\times10^9])$:

  1. 若$x\bmod a\geqslant y\bmod a$,返回字符$x$
  2. 若$x\bmod a< y\bmod a$,返回字符$y$

你最多询问$60$次

题解:$60$,差不多是$2\log_2n$。

令$x=ka+b(k\in\mathbb{N},0\leqslant b<a)$,$2x=(2k+[2b\geqslant a])a+(2b\bmod a)$。若$x\bmod a\geqslant2x\bmod a$,即$b\geqslant (2b\bmod a)$。当$k=0$时,$x<a\leqslant2x$。

这样就有了$a$的一个范围,然后在这个区间内二分,这题似乎我以前的二分写法不可以,需要$a\in[l,r]$时才有二分性,并且$mid\not=l$,不然询问返回都是$x$

卡点:翻译中没有$x,y\in[0,2\times10^9]$,导致我写了个简单一点的二分。发现后各种换二分方法。。。

 

C++ Code:

#include 
char op[20];int main() { scanf("%s", op); while (*op == 's') { int l = 0, r = 1; while (true) { printf("? %d %d\n", l, r); fflush(stdout), scanf("%s", op); if (*op == 'x') break; l = r, r <<= 1; } ++l; if (l != r) { while (l < r) { int mid = l + r >> 1; if (mid == l) ++mid; printf("%d %d\n", l, r); printf("? %d %d\n", mid, l); fflush(stdout), scanf("%s", op); if (*op == 'y') r = mid; else l = mid + 1; } } printf("! %d\n", l); fflush(stdout), scanf("%s", op); } return 0;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10351602.html

你可能感兴趣的文章
asp.net 获取IP地理位置的几个主要接口
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
python学习4 常用内置模块
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
ResolveUrl的用法
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
【转载】基于vw等viewport视区相对单位的响应式排版和布局
查看>>
<转>关于MFC的多线程类 CSemaphore,CMutex,CCriticalSection,CEvent
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>