zoukankan      html  css  js  c++  java
  • cf862d 交互式二分

    /*
    二分搜索出一个01段或10即可
    先用n个0确定1的个数num 
    然后测试区间[l,mid]是否全是0或全是1
    如果是,则l=mid,否则r=mid,直到l+1==r
    然后再测试l是1还是r是1
    
    如何判定[l,mid]是否全是0或1,将这一段变成1进行询问,如果结果=num+len或者结果=num-len,那么就是全0|1 
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1050
    char s[maxn];
    int n,num;
    int query(char *str){
        int res;
        cout<<"? "<<str<<endl;
        cin>>res;
        return res;
    }
    int judge(int l,int mid){
        for(int i=1;i<=n;i++)s[i]='0';
        for(int i=l;i<=mid;i++)s[i]='1';
        int res=query(s+1),len=mid-l+1;
        if(res==num+len||res==num-len)return 0;
        return 1;
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++)s[i]='0';
        num=query(s+1);
        int l=1,r=n,mid;
        while(l+1<r){
            int mid=l+r>>1;
            if(judge(l,mid))//如果[l,mid]区间有0|1
                r=mid;
            else l=mid; 
        }
        for(int i=1;i<=n;i++)
            s[i]='0';s[l]='1';
        int tmp=query(s+1);
        if(tmp>num)//l位置是0 
            cout<<"! "<<l<<" "<<r<<endl;
        else cout<<"! "<<r<<" "<<l<<endl; 
    } 
  • 相关阅读:
    [恢]hdu 1412
    [恢]hdu 2212
    [恢]hdu 1407
    [恢]hdu 1228
    [恢]hdu 1337
    [恢]hdu 1014
    [恢]hdu 2200
    定居到博客园了!
    比较GridView,DataList,Repeator ,DetailsView,FormView
    随手记录修改某条记录时,不使用数据库控件而用datareader
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10343140.html
Copyright © 2011-2022 走看看