zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",st);
            fflush(stdout);
            scanf("%d%d",&v,&ne);
            t=v;st=ne;
        }
        if(t<x) printf("! -1
    ");
        else printf("! %d
    ", t);
        fflush(stdout);
        return 0;
    }
  • 相关阅读:
    [CF1028D] Order book
    初入python,与同学者的第一次见面(小激动)
    jira与mysql的配合搭建调整
    linux内置的审计跟踪工具------last和lastb
    rman
    nginx和apache的一些比较
    NYOJ128前缀式计算
    NYOJ2括号配对问题
    大数加减乘以及高精度幂
    在不同的页面之间通过查询字符串传递信息
  • 原文地址:https://www.cnblogs.com/Noevon/p/7427571.html
Copyright © 2011-2022 走看看