这里有一道老实题,大家快来踩爆它!

交互题:根据你的输出决定下一次的输入。

请听题:

管理员有个乱序数列(举例:{14, 24, 9, 19}),排序以后是个等差数列({9, 14, 19, 24}),现在他只告诉你有n个数(样例n = 4)却不给你数列,让你求出最小的那个数(9)和公差d(5)。

而你可以在不超过60次的询问之后再给出结果,询问有两种方式:

1.    输出“> x”,暗示是否存在大于x的数,如果存在,管理员回复“1”,否则回复“0”。(这个回复自己读入一下谢谢~)

2.    输出“? i”,请求查询乱序数列第i个数是几,然后管理员会告诉你哒。

最后你得到结果后最终输出“! minnum d”。

样例:

input:

4

(注意以下输入数据是对应你的输出的)

0

1

14

24

9

19

output:
> 25(之后有了输入0)

> 15(之后有了输入1)

? 1 (之后有了输入14)

? 2

? 3

? 4

! 9 5(这个就是答案了)

题解:

头一次遇到这么简单的E题大家自己AC吧全剧终。

好,大家A掉了以后我来分享一下我做这个题的思路历程:

首先自鸣得意地想到如果数列长度不足60那在下岂不是厚着脸皮问出来就行了……于是有了下面这段代码:

 void work1() {
for (int i = ; i <= n; i++) {
printf("? %d\n", i);
fflush(stdout);
scanf("%d", &a[i]);
}
sort(a + , a + + n);
printf("! %d %d\n", a[], a[] - a[]);
} int main() {
scanf("%d", &n);
if (n <= ) work1();

然后果然这段代码是没卵用的,还是要想个更一般的方法。

那么根据这题的询问模式我们不难意淫到这样一个场景:你让心仪的妹子心中默念一个1~2147483647的数字,因为不忍心拒绝激动而又熟稔地背出一串奇怪数字的你,正在和吴彦祖聊天的妹子于是默念520。好的君已入瓮,你遂使出了(非)计算机专业引以为傲的“二分莽猜之术”猜了二三十次以后猜到了答案并说了出来,然后……

然后AlphaWA过来问你可以用这种方法得到最小值咩?啊不能。but问个log1e9(≈30)次总能得到个最大值了对吧?

好,好。30是60的一半,这路子很稳。有了最大值和项数,根据小学奥数知识我们不难搞出最小值了。

那么剩下的30次询问怎么用呢?可以得到其中的一些数喽。于是有了以下思考历程:

1.    用30次可以抽到(排序后)连续的两个数吗,这样公差d就出来了?欧皇可,非酋不可。

2.    那能搞到第二大的值吗,道理同上?回答同上。

3.    emmm那随便来几个数,有什么办法搞到d?唔,他们的差一定是d的倍数,gcd一遍就好啦!

4.    稳吗?不稳,比如2,4,6,8,10,12,我们如果抽到4,8,12,会得到d = 4这一错误结果。

5.    所以根据大数据的原理(大雾),数字越多错误率越低,且请随机抽取,免得有规律抽取被一些居心不良的红名同学出一组针对数据hack掉。

嗯,那就做完了。参考代码,请无视掉:小家子气的60以下特判、写1024次1024个模样的二分、未使用mt19937的乡下随机。

 #include <bits/stdc++.h>
using namespace std; int n, d, maxx;
int a[];
bool mark[]; int random(int n) {
return (double)rand()/RAND_MAX * n + 0.5;
} void work1() {
for (int i = ; i <= n; i++) {
printf("? %d\n", i);
fflush(stdout);
scanf("%d", &a[i]);
}
sort(a + , a + + n);
printf("! %d %d\n", a[], a[] - a[]);
} int main() {
scanf("%d", &n);
if (n <= ) work1();
else {
int l = , r = 1e9, cnt = ;
while (l < r) {//二分莽猜
int mid = (l + r) >> ;
printf("> %d\n", mid);
fflush(stdout);
cnt++;
scanf("%d", &d);
if (d) l = mid + , maxx = l;
else r = mid;
}
//随机序列
srand(time());
for (int i = cnt + ; i <= ; i++) {
d = ;
do {
mark[d] = true;
d = random(n) + ;
} while (mark[d]);
printf("? %d\n", d);
fflush(stdout);
scanf("%d", &a[i]);
}
sort(a + cnt + , a + );
//gcd
d = a[cnt+] - a[cnt+];
for (int i = cnt + ; i <= ; i++) {
d = __gcd(d, a[i] - a[i-]);
}
printf("! %d %d\n", maxx - (n-) * d, d);
}
return ;
}

奉上御用std:

 #pragma comment(linker, "/stack:247474112")
#pragma GCC optimize("Ofast") #include <bits/stdc++.h>
using namespace std; #define endl '\n'
mt19937 rng32(chrono::steady_clock::now().time_since_epoch().count()); int n, Max = -, d = ;
int queryRemaining = ; vector<int> id; void findMax() {
int top = -, bot = +;
while (top <= bot) {
int hasHigher;
int mid = (top + bot) / ;
cout << "> " << mid << endl;
fflush(stdout); cin >> hasHigher;
queryRemaining--;
if (hasHigher) top = mid + ;
else {bot = mid - ; Max = mid;}
}
} void findD() {
vector<int> List; int RandomRange = n;
while (queryRemaining > && RandomRange > ) {
int demandedIndex = rng32() % RandomRange;
cout << "? " << id[demandedIndex] << endl; fflush(stdout);
int z; cin >> z; List.push_back(z);
RandomRange--; queryRemaining--;
swap(id[demandedIndex], id[RandomRange]);
}
sort(List.begin(), List.end());
if (List.back() != Max) List.push_back(Max);
for (int i=; i<List.size(); i++) {
d = __gcd(d, List[i] - List[i-]);
}
} void Input() {
cin >> n; id.resize(n);
for (int i=; i<n; i++) id[i] = i+;
} void Solve() {
findMax(); findD();
int Min = Max - d * (n - );
cout << "! " << Min << " " << d;
cout << endl; fflush(stdout);
} int main(int argc, char* argv[]) {
ios_base::sync_with_stdio();
Input(); Solve(); return ;
}

Codeforces 1114E(简单交互)的更多相关文章

  1. cocos2d-x lua与c++简单交互

    cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...

  2. unity3d和php后台简单交互--二

    上次我们讨论了u3d和php的简单交互,现在我们接着讨论u3d和php交互,这里我们讨论的是php的后台大家可以延伸为其他语言.在实现的开发中我们很少通过发送字符或者字段到服务器上的,我们一般会请求包 ...

  3. unity3d和php后台简单交互--一

    unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支 ...

  4. python和mongodb简单交互

    python和mongodb简单交互 1.安装pymongo: pip3 install pymongo 2.pymongo的简单用法: # /usr/bin/env python3 import p ...

  5. python和redis简单交互

    python和redis简单交互 1.安装redis模块 pip3 install redis 2.redis模块简单使用: # /usr/bin/env python3 import redis c ...

  6. 学习HTML 第五节.简单交互 加个按钮

    学习HTML 第五节.简单交互 也许你和我一样,对页面排版的兴趣小于网页交互,那么我们就先略过一些章节,直接先学一下简单交互. 前面点击图片打开链接的网址,已经是最简单的交互方式了,复杂的方式则需要用 ...

  7. 2020年的UWP(3)——UWP和desktop extension的简单交互

    上一篇<2020年的UWP(2)--In Process App Service>中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互.本篇我们就 ...

  8. java,js,jstl,EL的简单交互

    EL全名Expression Language.EL提供了在JSP脚本编制元素范围外使用运行时表达式的功能. 脚本编制元素是指页面中能够用于在JSP文件中嵌入java代码的元素. JSP标准标记库(j ...

  9. Codeforces 1114E - Arithmetic Progression - [二分+随机数]

    题目链接:http://codeforces.com/problemset/problem/1114/E 题意: 交互题,有一个 $n$ 个整数的打乱顺序后的等差数列 $a[1 \sim n]$,保证 ...

随机推荐

  1. SYN FLOOD学习理解

    SYN FLOOD是一种比较常见的DoS攻击手段,它的特点就是防不胜防.SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源.SYN攻击除了能影响主机外 ...

  2. 编写按键驱动以及在framework层上报按键事件

    平台信息:内核:linux3.10 系统:android6.0平台:RK3288 前言:本文主要实现的功能是在android系统中添加一个按键,在驱动层使用定时器,每隔1秒钟向上层发送按键实现,fra ...

  3. 兼容html5新标签及媒体查询引入插件

    <!-- 以下2个插件是用于在IE8支持HTML5元素和媒体查询的,如果不用可移除 --> <!--[if lt IE 9]> <script src="htt ...

  4. (转)vim 访问系统剪贴板

    原文出处:http://vim.wikia.com/wiki/Accessing_the_system_clipboard Please review this tip: This tip was i ...

  5. JNI——C调用JAVA

    步骤: 1. 创建虚拟机 2. 获得class 3. 实例化对象:获得构造方法(方法名为“<init>”),构造参数,调用方法 4. 调用方法:又分为获得方法,构造方法,调用方法 操作方法 ...

  6. AndroidStudio自动弹出Documentation

    AndroidStudio自动弹出Documentation窗口 例如,在布局文件中添加 Button 标签 敲完 <Butotn 回车后就自动出现 Documentation窗口 那如何关闭自 ...

  7. bzoj2962

    线段树+卷积 这个东西直接算不太好,但是合并两段结果却很方便,假设c[i]表示选i个数乘积的和,那么$a[i]=\sum_{j=0}^{i}{b[j]*c[i-j]}$ 线段树维护即可 #includ ...

  8. C# 获取点击列的索引

    datagridview 怎么获取选中行的某一列的索引比如 下面是表学号 姓名 所在年级 1    张     高一 2    李     高二当我选择第二行的时候 我想取所在年级的列索引 这时候那个 ...

  9. 使用 Git 命令去管理项目的版本控制(一)

    参考资料:参考  参考 声明本文是作者原创,是自己的学习笔记,仅供学习参考. 在 10.11.2Mac系统中,要显示隐藏的文件夹使用命令行: defaults write com.apple.find ...

  10. HDOJ-2160

    母猪的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...