题面:

传送门

思路:

这是一道交互题

比赛的时候我看到了直接跳过了......

后来后面的题目卡住了就回来看这道题,发现其实比较水

实际上,从整个序列里面随机选1000个数出来询问,然后从里面找出比x小的最大的那个,再往后面搜1000个数(顺序),这样的方法,不成功率是1.7e-9......

所以随机化就可以了~

(要是这样还WA那真的是脸黑呢......)

Code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
int n,st,x;
int val[],next[];
int cnt;
struct node{
int v,p;
}s[];
bool cmp(node l,node r){
return l.v<r.v;
}
int main(){
int i,tmp,ttmp,t1,t2;
srand(time(NULL));
scanf("%d%d%d",&n,&st,&x);
printf("? %d",st);
scanf("%d%d",&t1,&t2);
if(x<t1){
printf("! -1");return ;
}
val[st]=t1;next[st]=t2;
for(i=;i<=min(,n);i++){
tmp=rand()*rand()%n+;
printf("? %d",tmp);
scanf("%d%d",&t1,&t2);
s[++cnt].v=t1;s[cnt].p=tmp;
val[tmp]=t1;next[tmp]=t2;
}
sort(s+,s+cnt+,cmp);
for(i=;i<cnt;i++){
if(s[i].v<x&&s[i+].v>=x) break;
}
tmp=s[i].p;
if(n<=){
printf("! %d",val[tmp]);return ;
}
for(i=;i<=;i++){
ttmp=next[tmp];
printf("? %d",ttmp);
scanf("%d%d",&val[ttmp],&next[ttmp]);
if(val[ttmp]>=x){
printf("! %d",val[tmp]);return ;
}
tmp=ttmp;
}
}

最新文章

  1. Apache2 worker
  2. mysql数据导出excel格式+乱码解决
  3. c# tabcontrol事件以及上下文菜单
  4. VMware vSphere 5.1 简介与安装
  5. 开源免费ERP/CRM/SCM:iDempiere 2.0 安装配置
  6. paip.提升效率---filter map reduce 的java 函数式编程实现
  7. Excel 函数记录
  8. block的传值简单示例仅供参考,大牛勿喷
  9. Php开发完全跨站点跨域名单点(SSO)同步登录和注销
  10. FAQ:Python 断点调试
  11. HOWTO: 为GitHub for Windows指定代理服务器(转)
  12. Android开发之Mediaplayer
  13. c#之冒泡排序的三种实现和性能分析
  14. Unity3D ——强大的跨平台3D游戏开发工具(一)
  15. 201521123080《Java程序设计》第5周学习总结
  16. 域名和ip不能访问的原因
  17. ie 浏览器文本输入框和密码输入框的默认样式
  18. Win10提示无法创建新的分区也找不到现有的分区解法
  19. Linux下安装jdk1.7
  20. python记录_day018 md5加密

热门文章

  1. 选中ListBox控件中的全部项
  2. python剑指offer剪绳子
  3. python_37_文件修改
  4. PAT (Advanced Level) Practise - 1094. The Largest Generation (25)
  5. Luogu P1471 方差
  6. mahout算法解析
  7. Echarts样式
  8. swl字符串
  9. java util - 时间工具包 PrettyTime
  10. Nordic Collegiate Programming Contest (NCPC) 2016