cf862d 交互式二分
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于cf862d 交互式二分的主要内容,如果未能解决你的问题,请参考以下文章
CF.810D.Glad to see you!(交互 二分)
cf1064E. Dwarves, Hats and Extrasensory Abilities(二分 交互)
CF.862D.Mahmoud and Ehab and the binary string(交互 二分)