cf 843 B Interactive LowerBound [随机化]
2024-08-29 11:24:48
题面:
思路:
这是一道交互题
比赛的时候我看到了直接跳过了......
后来后面的题目卡住了就回来看这道题,发现其实比较水
实际上,从整个序列里面随机选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;
}
}
最新文章
- Apache2 worker
- mysql数据导出excel格式+乱码解决
- c# tabcontrol事件以及上下文菜单
- VMware vSphere 5.1 简介与安装
- 开源免费ERP/CRM/SCM:iDempiere 2.0 安装配置
- paip.提升效率---filter map reduce 的java 函数式编程实现
- Excel 函数记录
- block的传值简单示例仅供参考,大牛勿喷
- Php开发完全跨站点跨域名单点(SSO)同步登录和注销
- FAQ:Python 断点调试
- HOWTO: 为GitHub for Windows指定代理服务器(转)
- Android开发之Mediaplayer
- c#之冒泡排序的三种实现和性能分析
- Unity3D ——强大的跨平台3D游戏开发工具(一)
- 201521123080《Java程序设计》第5周学习总结
- 域名和ip不能访问的原因
- ie 浏览器文本输入框和密码输入框的默认样式
- Win10提示无法创建新的分区也找不到现有的分区解法
- Linux下安装jdk1.7
- python记录_day018 md5加密