【模拟】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就结束。

 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 */
View Code
原文地址:https://www.cnblogs.com/Coolxxx/p/5822696.html