【构造 && 随机函数 && 概率论 && 思维】Gym - 100851J Jump

翻译 2018年04月15日 15:13:39

Step1 Problem:

交互题
你每次猜一个长度为n的由0,1组成的字符串
如果有n/2个位置对应相等,返回n/2
如果有n个位置对应相等,返回n(此时相当于猜对)
否则,返回0
最多可以猜 n+500次,如何猜对隐藏串
数据范围:
1<=n<=1000 同时 n 是 偶数

Step2 Involving algorithms:

随机函数 期望几何分布 思维

Step3 Ideas:

对于一个串n,每个位置猜对的概率是1/2,有n/2个位置猜对的概率 C(n/2, n) * (1/2)^n
对于这个式子,n越大,概率越小,n最大为1000,概率为0.025左右
猜对次数的期望 E(x) = 1/p = 1/0.025 = 40 所以40次基本能猜对。
这时候我们得到对n/2个位置的01串
翻转第一个位置的串的前提下,去分别翻转其他位置
如果返回n/2
假设第一个位置一开始是错的,翻转位置原本是对的
假设第一个位置一开始是对的,翻转位置原本是错的
记录一下位置,然后翻转成全对或者全错,询问一下即可

Step4 Code:

#include<bits/stdc++.h>
using namespace std;
int vis[1005];
char s[1005];
int main()
{
    srand(time(NULL));
    int n, ok;
    scanf("%d", &n);
    s[n+1] = '\0';
    while(1)
    {
        for(int i = 1; i <= n; i++)
        {
            s[i] = (rand()%2) + '0';
        }
        printf("%s\n", s+1);
        cin >> ok;
        if(ok == n/2 || ok == n) break;
    }
    if(ok == n/2)
    {
        memset(vis, 0, sizeof(vis));
        s[1] = ((s[1]-'0')^1) + '0';
        for(int i = 2; i <= n; i++)
        {
            s[i] = ((s[i]-'0')^1) + '0';
            printf("%s\n", s+1);
            cin >> ok;
            if(ok == n/2) {
                vis[i] = 1;
            }
            s[i] = ((s[i]-'0')^1) + '0';
        }
        for(int i = 2; i <= n; i++)
        {
            if(!vis[i])
                s[i] = ((s[i]-'0')^1) + '0';
        }
        printf("%s\n", s+1);
        cin >> ok;
        if(!ok)
        {
            for(int i = 1; i <= n; i++)
            {
                s[i] = ((s[i]-'0')^1) + '0';
            }
            printf("%s\n", s+1);
        }
    }
    return 0;
}

GYM - 101572G Galactic Collegiate Programming Contest 离散化 + 线段树或树状数组

题目链接: GYM - 101572题目大意一场比赛, 每个队伍的分数由(a, b)组成, a是做题数量, b是总罚时, 题量多的排名前, 相同题量罚时少靠前, 如果题量罚时都相同, 排名一样, 例如...
  • litmxs
  • litmxs
  • 2017-10-15 16:56:17
  • 215

Gym 101572 D Distinctive Character [bfs+想法]

Gym 101572 D Distinctive Character [bfs+想法]
  • ACTerminate
  • ACTerminate
  • 2017-10-15 19:24:16
  • 394

工作总结

1、今天被公司的领导在公司员工面前批评了一顿,搞得很是灰头土脸,心中很是难受,一直认为自己内心虽说不是很坚强,但是这几年的工作经验让我成长了不少,本 着“不害怕”,“不羞愧”,“不后悔”的精神宗旨,...
  • renpinghao
  • renpinghao
  • 2011-09-19 23:06:39
  • 651

Gym - 101572G

题目大意一场比赛, 每个队伍的分数由(a, b)组成, a是做题数量, b是总罚时, 题量多的排名前, 相同题量罚时少靠前, 如果题量罚时都相同, 排名一样, 例如, (1, 1), (1, 1), ...
  • HowardEmily
  • HowardEmily
  • 2017-11-03 23:37:00
  • 124

Gym 100851J Jump(构造)

这题是个交互题,后台有个长度为偶数n的01串s,让你猜这个串,然后看有多少位对应相同,当只有n/2,n个相同的时候返回n/2,n,否则都是返回0,让你最多用n+500猜,猜到正确答案这题是个交互题,后...
  • Miracle_ma
  • Miracle_ma
  • 2016-08-15 20:12:10
  • 387

[Codeforces Gym100851J] Jump (构造+脑洞)

Codeforces - Gym100851J (NEERC15 - J) 交互题,有一个隐藏的长度为 NN的 01串 SS 每次可以询问一个 01串 QQ,如果两串有一半相等或者全部相等 ...
  • u012015746
  • u012015746
  • 2016-08-15 17:56:58
  • 403

Gym - 100971G- Repair-思维题

给定你一个 a*b的矩形 每次切割时只能平行边界的切割。 给你两套 a,b问你是否能切割下来这俩矩形。我一开始以为 只要判断对角线就行了。。。。 但是用sqrt竟然样例都不对。幸好队友过了。。 ...
  • qq_35781950
  • qq_35781950
  • 2017-05-19 16:39:35
  • 131

如何构造另一个随机生成函数?

昨天下午面搜狐的时候被问到了构造随机数生成函数的问题,事后觉得有必要归纳一下相关题型。 1.已知随机数生成函数randA能等概率生成0~n的整数,设计一个等概率生成0~m的randB 算法: 若...
  • yeqiuzs
  • yeqiuzs
  • 2017-08-03 14:25:49
  • 425

(八)理解迭代思维(80)

迭代思维   --关于创新流程 什么是迭代思维 迭代思维是关于创新流程的思维,允许产品出现缺点,不断试错,不断优化,在持续的迭代中完善产品。   迭代思维有哪些法则  ...
  • modaiairen524
  • modaiairen524
  • 2018-02-06 00:02:17
  • 93

统计思维:程序员数学之概率统计,完整高清版.pdf

  • 2014年06月26日 13:46
  • 7.36MB
  • 下载
收藏助手
不良信息举报
您举报文章:【构造 && 随机函数 && 概率论 && 思维】Gym - 100851J Jump
举报原因:
原因补充:

(最多只允许输入30个字)