zoukankan      html  css  js  c++  java
  • Codeforces 862D. Mahmoud and Ehab and the binary string 【二分】(交互)

    <题目链接>

    题目大意:

    有一个长度为n(n<1000)的01串,该串中至少有一个0和一个1,现在由你构造出一些01串,进行询问,然后系统会给出你构造的串与原串的   Hamming distance ,现在要求你按照步骤进行交互式操作,最终得到任意一个0、1的下标。

    解题分析:
    因为原串中至少存在一个0和一个1,所以一定存在一个01或者10序列,因此我们可以用二分来寻找这个序列(注意二分过程中选择区间的操作)。二分之后,一定能够得到01或10序列,然后将其按先0后1的顺序输出即可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 using namespace std;
     5 
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     int n,num;cin>>n;
     9     puts("?");
    10     for(int i=1;i<=n;i++)cout<<"0";
    11     puts("");
    12     cin>>num;      //第一次交互,先得到序列中1的个数
    13     int l=1,r=n;
    14     while(r-l>=2){             //二分寻找01或10串
    15         int mid=(l+r)>>1;
    16         puts("?");                         
    17         for(int i=1;i<=n;i++){                  //这里的区间判定方法很难想
    18             if(i>=l && i<=mid)cout<<"1";
    19             else cout<<"0";
    20         }puts("");
    21         int x1;cin>>x1;
    22         if(abs(num-x1)==(mid-l+1))l=mid;      //判断左区间是否全为0或全为1,因为我们需要查找的是01串,所以需要向含有01串的地方收敛
    23         else r=mid;
    24     }
    25     //得到了10或01串的位置后,判断其中0、1的位置
    26     puts("?");
    27     for(int i=1;i<=n;i++){
    28         if(i==l)cout<<"1";
    29         else cout<<"0";
    30     }puts("");
    31     int x2;cin>>x2;
    32     if(x2<num) printf("! %d %d
    ",r,l);      //先输出0的位置
    33     else printf("! %d %d
    ",l,r);
    34 }

    2019-02-01

  • 相关阅读:
    Importing data in R 1
    R Tidyverse dplyr包学习笔记2
    搭建PHP开发环境
    R parallel包学习笔记2
    测试笔试单选题(持续更新ing)
    http cookie管理中cookie police下部分参数含意
    全国省市县区域信息最新数据库脚本(mysql版本)
    Jmeter运行后出现乱码
    从自身谈在成熟与幼稚公司做测试的差别
    SQL查询中用到的函数
  • 原文地址:https://www.cnblogs.com/00isok/p/10346149.html
Copyright © 2011-2022 走看看