codeforce843B Interactive LowerBound

题意:交互式的题,给你n,s, x,链表元素有n个,开始的位置是s,每次询问输入数组的下标,可以知道对应链表上的数和链表下一个数的位置,只能询问2000次,要找到第一个大于等于x的数

题解:先随机找小于n的1000个数,询问每一个下标,找到大小与x最近的数,再从这个数沿着链表向后找,直到找到第一个大于等于x的数或者找到链表的结尾。。。

概率分析:假设经过上面的操作后找不到答案,设x数组的下表为t,那么随机的1000个数就是都不在[t-1000, t]当中,所有数都不在的概率也就是找不到答案的概率就是(1-1000/n)^1000是一个很小的数。

这里用到了random_shuffle函数,作用是找一个该数组的全排列

#include<bits/stdc++.h>
using namespace std;
int n,x,v,ne,t=-1,q[50010], cnt, st;
int main(){
    scanf("%d%d%d",&n,&st,&x);
    for(int i=0;i<n;i++) q[i] = i+1;
    random_shuffle(q, q+n);
    cnt = min(n, 999);
    for(int i=0;i<cnt;++i){
        printf("? %d\n",q[i]);
        fflush(stdout);
        scanf("%d%d",&v,&ne);
        if(v<=x&&t<v) t=v,st=ne;
    }
    while(st!=-1&&t<x){
        printf("? %d\n",st);
        fflush(stdout);
        scanf("%d%d",&v,&ne);
        t=v;st=ne;
    }
    if(t<x) printf("! -1\n");
    else printf("! %d\n", t);
    fflush(stdout);
    return 0;
}

 

转载于:https://www.cnblogs.com/Noevon/p/7427571.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值