Codeforces Round #435 (Div. 2) D. Mahmoud and Ehab and the binary string[二分]

题目:http://codeforces.com/problemset/problem/862/D

题意:交互题,询问15次以内Hamming distance,输出一个二进制串里任意一个0或1的位置

题解:极简单的二分,从最后一位先判断一个,然后二分 根据上次和本次的距离差是否等于二分长度判断在左端还是右端有需要寻找的值寻找另一个。

 1 #define _CRT_SECURE_NO_DEPRECATE
 2 #pragma comment(linker, "/STACK:102400000,102400000")
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<fstream>
 6 #include<iomanip>
 7 #include<algorithm>
 8 #include<cmath>
 9 #include<deque>
10 #include<vector>
11 #include<bitset>
12 #include<queue>
13 #include<string>
14 #include<cstring>
15 #include<map>
16 #include<stack>
17 #include<set>
18 #include<functional>
19 #define pii pair<int, int>
20 #define mod 1000000007
21 #define mp make_pair
22 #define pi acos(-1)
23 #define eps 0.00000001
24 #define mst(a,i) memset(a,i,sizeof(a))
25 #define all(n) n.begin(),n.end()
26 #define lson(x) ((x<<1))
27 #define rson(x) ((x<<1)|1)
28 #define inf 0x3f3f3f3f
29 typedef long long ll;
30 typedef unsigned long long ull;
31 using namespace std;
32 const int maxn = 1e3 + 5;
33
34 string a;
35 int ans0, ans1;
36 int main()
37 {
38     ios::sync_with_stdio(false);
39     cin.tie(0); cout.tie(0);
40     int i, j, k, m, n;
41     cin >> n;
42     int mode;
43     a.append(n, ‘0‘);
44     int cas = 0, test;
45     cout << "? " << a << endl;
46     cout.flush();
47     cin >> cas;
48     a[n - 1] = ‘1‘;
49     cout << "? " << a << endl;
50     cout.flush();
51     cin >> test;
52     if (test == cas + 1) { ans0 = n; mode = 1; }
53     else { ans1 = n; mode = 0; }
54     if (mode == 0) { cas = n - cas; for (int i = 0; i < n; ++i)a[i] = ‘1‘; }
55     else cas = test;
56     int l = 0, r = n - 2;
57     while (r - l > 1)
58     {
59         int mid = l + r >> 1;
60         for (int i = l; i <= mid; ++i)a[i] = mode + ‘0‘;
61         cout << "? " << a << endl;
62         cout.flush();
63         cin >> test;
64         int len = mid - l + 1;
65         if (test - len == cas) { l = mid + 1; cas = test; }
66         else { for (int i = l; i <= mid; ++i)a[i] = (mode ^ 1) + ‘0‘; r = mid; }
67     }
68     a[l] = mode + ‘0‘;
69     cout << "? " << a << endl;
70     cout.flush();
71     cin >> test;
72     if (test == cas - 1)
73     {
74         if (mode == 1)ans1 = l+1;
75         else ans0 = l+1;
76     }
77     else
78     {
79         if (mode == 1)ans1 = r+1;
80         else ans0 = r+1;
81     }
82     cout << "! " << ans0 << " " << ans1 << endl;
83     cout.flush();
84     return 0;
85 }
时间: 2024-10-24 19:25:27

Codeforces Round #435 (Div. 2) D. Mahmoud and Ehab and the binary string[二分]的相关文章

Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function(预处理+二分)

题目链接:点我点我 题意:公式:,给出n个数,从a[1]到a[n],和m个数(b数组),然后从b数组里挑出连续的n个数(也就m-n+1中选择),按公式计算,使得f最小, 还有q次对a数组的操作(某个区间增加值,减少值),求出最小值. 题解:显然对a数组的处理非常简单,一开始确定一定值,然后update的时候,判断一下奇偶性质就可以直接加了(前一项正后一项一定是负的,可以抵消). 然后就是b数组的处理了,一开始没处理好,一直在这边卡超时.先把b数组一项一项正负不同的加进去,然后再进行处理,得到c数

Codeforces Round #286 (Div. 2)A. Mr. Kitayuta&#39;s Gift(暴力,string的应用)

由于字符串的长度很短,所以就暴力枚举每一个空每一个字母,出现行的就输出.这么简单的思路我居然没想到,临场想了很多,以为有什么技巧,越想越迷...是思维方式有问题,遇到问题先分析最简单粗暴的办法,然后一步一步的优化,不能盲目的想. 这道题要AC的快需要熟悉string的各种用法.这里做个简单总结:C++中string的常见用法. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin

D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)

http://codeforces.com/contest/862/problem/D 询问题 fflush(stdout) 调试: 先行给出结果,函数代替输入 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <time.h> 6 #include <string> 7 #include <se

E. Mahmoud and Ehab and the function Codeforces Round #435 (Div. 2)

http://codeforces.com/contest/862/problem/E 二分答案 一个数与数组中的哪个数最接近: 先对数组中的数排序,然后lower_bound 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <time.h> 6 #include <string> 7 #includ

Codeforces Round #396 (Div. 2)C. Mahmoud and a Message(dp)

题目链接:http://codeforces.com/problemset/problem/766/C 题意:给你一组小写字母组成的字符串,和26个数字,分别对应26位小写字母能够存在的字符串的最大长度. 要求:①:求出最多的划分方案 ②:求出分配方案中,最长的子串长度 ③:求出分配方案中,最少分成的子串数 思路:关于①:设置dp[i],dp[i]表示在第i个字符后面有一个横杠的方案数,从第i个往前枚举前一个横杠的位置j. 举个例子,有子串abc,当横杠断在a处,有一种方案,dp[1]=1:当横

Codeforces Round #435 (Div. 2) c+d

C:给n和k要求,找出n个不同的数,使得亦或起来等于k 可以先预处理从1到1e5,找亦或起来等于(11111111111111111)(二进制)的所有对数,然后四个一起亦或就是0了,再和k亦或 可以看出要分四种情况讨论,对于n%4=p的情况,应该找到p-1个不同的数亦或起来等于0,可以小范围的p-1重循环搜索,对于n%4==2&&x==0的情况要注意特判,可以用6重循环,每层不超过10 代码过于复杂了,应该可以简化一下 #include<bits/stdc++.h> #defi

Codeforces Round #396(Div. 2) A. Mahmoud and Longest Uncommon Subsequence

[题意概述] 找两个字符串的最长不公共子串. [题目分析] 两个字符串的最长不公共子串就应该是其中一个字符串本身,那么判断两个字符串是否相等,如果相等,那么肯定没有公共子串,输出"-1".否则就是两个字符串中长的最长的长度. [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() { 4 char str1[100005],str2[100005]; 5 scanf("%s%s"

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction

题意:给出各个字符串出现的起始位置,问整个的字符串是什么,(字典序最小) 思路:开始写的是用set+优先队列存取每个位置出现的最长字符串,然后遍历,爆内存...爆...内...存...我们可以用并查集,已经确认的位置他们并在一起,指向后面第一个没有被确认的(看代码理解吧) 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e6+10; 4 5 int n,fa[N]; 6 char s[N],b[N]; 7 8 in

Codeforces Round #371 (Div. 1) D - Animals and Puzzle 二维ST表 + 二分

D - Animals and Puzzle #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define PLI pair<LL, int> #define ull unsigned long long using namespace std; const in