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

    题目链接:Mahmoud and Ehab and the binary string

    题意:

      一道交互题,首先给出一个字符串的长度l。现在让你进行提问(最多15次),每次提问提出一个字符串,会返回这个字符串与目标串之间不同的字符的个数。要在15次的提问内,找到目标串中任意一个1和0的位置。

    题解:

      因为是15次提问,其实可以想到二分,但是分别对0和1进行二分差不多要二十多次,所以可以对01或10进行二分,查找某一个01或10串的位置。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAX_N = 1e5+9;
     4 int vec[MAX_N];
     5 int main()
     6 {
     7     int N,M,T;
     8     cin>>N;
     9     printf("?
    ");
    10     for(int i=1;i<=N;i++) printf("0");
    11     cout<<endl;
    12     int num;
    13     cin>>num;
    14     int l = 1,r = N,x;
    15     while(r-l>=2)
    16     {
    17         int mid = (l+r)/2;
    18         printf("?
    ");
    19         for(int i=1;i<=N;i++)
    20         {
    21             if(i>=l && i<=mid) printf("1");
    22             else printf("0");
    23         }
    24         cout<<endl;
    25         cin>>x;
    26         if(abs(num - x) == mid - l + 1) l = mid;
    27         else r = mid;
    28     }
    29     int x1,x2;
    30     printf("?
    ");
    31     for(int i=1;i<=N;i++)
    32     {
    33         if(i == l) printf("1");
    34         else printf("0");
    35     }
    36     cout<<endl;
    37     cin>>x1;
    38     if(x1<num)
    39     {
    40         printf("! %d %d
    ",r,l);
    41     }
    42     else printf("! %d %d
    ",l,r);
    43     return 0;
    44 }
  • 相关阅读:
    Search Insert Position
    lintcode: 最长连续序列
    lintcode:颜色分类
    lintcode: 堆化
    lintcode: 旋转图像
    lintcode: 寻找旋转排序数组中的最小值
    lintcode: 跳跃游戏 II
    lintcode:最小差
    华为:数独填充
    华为:字符集合
  • 原文地址:https://www.cnblogs.com/doggod/p/8559184.html
Copyright © 2011-2022 走看看