zoukankan      html  css  js  c++  java
  • 【AIM Tech Round 4 (Div. 1) B】Interactive LowerBound

    【链接】http://codeforces.com/contest/843/problem/B


    【题意】


    给你一个数组模拟的单链表,放在一个长度为n的数组里面,然后告诉你表头的位置在哪里;
    你可以最多询问2000次,每次询问一个数组下表它所代表的元素的大小,以及它下一个元素在哪里.
    让你求出最小的大于等于x的数字是什么.
    链表按照表头到表尾是严格升序的
     n,表头的位置,以及x是给你的。然后表里的元素你只能通过询问知道
    n最大5万

    【题解】


    第一次写随机化算法.
    思路就是生产1000个1..n之间的随机数,然后看看所在的位置的数字是不是比x来的小,然后尽量找比x小又是最大的那个数字所在的位置temp;
    然后再有999个询问,则是一直往链表的下一个位置走;
    直到,这个数字大于等于x或者999次之后还没找到,就认为所有元素都比它小.
    好神奇。。。

    【错的次数】


    0

    【反思】


    种子一定要设置为time(0);

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb emplace_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define ri(x) scanf("%d",&x)
    #define rl(x) scanf("%lld",&x)
    #define rs(x) scanf("%s",x)
    #define oi(x) printf("%d",x)
    #define ol(x) printf("%lld",x)
    #define oc putchar(' ')
    #define os(x) printf(x)
    #define all(x) x.begin(),x.end()
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    #define sz(x) ((int) x.size())
    
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    
    mt19937 myrand(time(0));
    int get_rand(int n){return myrand()%n + 1;}
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 110;
    
    
    int n,start,x;
    
    
    
    
    
    
    int main(){
        //Open();
        //Close();
        ri(n),ri(start),ri(x);
        int ma = -1,temp = start;
        rep1(i,1,1000){
            int X = get_rand(n);
            printf("? %d
    ",X);
            fflush(stdout);
            int y,z;
            ri(y),ri(z);
            if ( y > ma && y < x){
                ma = y;
                temp = z;
            }
        }
        rep1(i,1,999){
            if (temp==-1) break;
            printf("? %d
    ",temp);
            fflush(stdout);
            int y,z;
            ri(y),ri(z);
            if (y >= x){
                printf("! %d
    ",y);
                return 0;
            }
            temp = z;
        }
        puts("! -1");
        return 0;
    }
    


  • 相关阅读:
    【7】用Laravel5.1开发一个简单的博客系统
    【6】Laravel5.1的migration数据库迁移
    【5】说说Laravel5的blade模板
    【4】优化一下【3】的例子,顺便说说细节
    【3】创建一个简单的Laravel例子
    【2】最简单的Laravel5.1程序分析
    【1】Laravel5.1 安装
    【0】Laravel 5.1 简介
    MySQL常用命令
    Windows8.1使用博客客户端写博客
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626083.html
Copyright © 2011-2022 走看看