【模拟】NEERC15 J Jump(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
题目链接:
http://codeforces.com/gym/100851
题目大意:
系统里生成一个字符串C,一开始告诉你字符串的长度N(偶数)。接着你需要在n+500次内猜出这个字符串是什么。
每次你可以输出一个长度为N的字符串S,系统根据你输出的字符串S和C的匹配数量输入一个数,若为n/2则输入n/2,若为n则输出n,否则输入0。
只要一猜对字符串就要结束程序(即输入的数为n)。如果询问次数超过n+500则出错。每次输出完要fflush(stdout).
题目思路:
【模拟】
这题真的很有意思。根据概率随机500次出现至少一次n/2或n的概率非常高(99.999%以上)
于是先随机生成S串询问,如果找到不是0的回答则:
假设S的第一个字符正确,每次将第I个字符和第一个字符取反,再询问取反后的字符,如果得到0的回答则表明取反后的I位是错误的,如果为n/2则取反后的I位正确,把相应正确的答案填到C里,把S取反的两位还原后做I+1位。(假设第一个字符正确,取反后错误,目前正确的个数为n/2-1,如果第I位取反后还是n/2个正确则表明取反后把当前这位改对了,否则就是改错了原先是对的)
总共枚举N次即可得到答案。如果最终答案C还不对,则是前提条件(S的第一个字符正确)错了,把整个串都取反即使正解。(可以看作类似映射,从0->0,1->1变为0->1,1->0,各个字符之间的同异是不会改变的。)
需要每次判断当前回答是不是n,是n就结束。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<map> 9 #include<stack> 10 #include<queue> 11 #include<set> 12 #include<bitset> 13 #include<memory.h> 14 #include<time.h> 15 #include<stdio.h> 16 #include<stdlib.h> 17 #include<string.h> 18 //#include<stdbool.h> 19 #include<math.h> 20 #define min(a,b) ((a)<(b)?(a):(b)) 21 #define max(a,b) ((a)>(b)?(a):(b)) 22 #define abs(a) ((a)>0?(a):(-(a))) 23 #define lowbit(a) (a&(-a)) 24 #define sqr(a) ((a)*(a)) 25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 26 #define mem(a,b) memset(a,b,sizeof(a)) 27 #define eps (1e-8) 28 #define J 10 29 #define mod 1000000007 30 #define MAX 0x7f7f7f7f 31 #define PI 3.14159265358979323 32 #define N 1004 33 using namespace std; 34 typedef long long LL; 35 int cas,cass; 36 int n,m,lll,ans; 37 char s[N],c[N]; 38 int main() 39 { 40 #ifndef ONLINE_JUDGE 41 // freopen("1.txt","r",stdin); 42 // freopen("2.txt","w",stdout); 43 #endif 44 int i,j,k; 45 // for(scanf("%d",&cass);cass;cass--) 46 // for(scanf("%d",&cas),cass=1;cass<=cas;cass++) 47 // while(~scanf("%s",s+1)) 48 // while(~scanf("%d",&n)) 49 { 50 srand(time(0)); 51 scanf("%d",&n); 52 m=0; 53 while(!m) 54 { 55 for(i=0;i<n;i++)s[i]=(rand()&1)?'0':'1'; 56 puts(s); 57 fflush(stdout); 58 scanf("%d",&m); 59 } 60 if(m==n)return 0; 61 c[0]=s[0]; 62 s[0]='0'+'1'-s[0]; 63 for(i=1;i<n;i++) 64 { 65 s[i]='0'+'1'-s[i]; 66 puts(s); 67 fflush(stdout); 68 scanf("%d",&m); 69 if(m==n)return 0; 70 if(m)c[i]=s[i]; 71 else c[i]='0'+'1'-s[i]; 72 s[i]='0'+'1'-s[i]; 73 } 74 puts(c); 75 fflush(stdout); 76 scanf("%d",&m); 77 if(m==n)return 0; 78 for(i=0;i<n;i++)c[i]='0'+'1'-c[i]; 79 puts(c); 80 fflush(stdout); 81 scanf("%d",&m); 82 } 83 return 0; 84 } 85 /* 86 // 87 88 // 89 */