码迷,mamicode.com
首页 > 其他好文 > 详细

cf862d 交互式二分

时间:2019-01-31 19:17:59      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:std   return   一段   搜索   ==   就是   namespace   交互式   class   

/*
二分搜索出一个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; 
} 

 

cf862d 交互式二分

标签:std   return   一段   搜索   ==   就是   namespace   交互式   class   

原文地址:https://www.cnblogs.com/zsben991126/p/10343140.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!