• codeforces 476B.Dreamoon and WiFi 解题报告


    题目链接:http://codeforces.com/problemset/problem/476/B

    题目意思:给出两个字符串str1, str2,其中,str1 只由 '+' 和 '-' 组成,而str2 由 '+','-'和'?'组成。初始点在原点0的位置,经过 str1 的变换最终会达到某一个位置,‘+'表示向右移动一个单位(+1),'-'即-1。str2 中 '?'的部分可以填入'+','-'其中一个符号。问能填充 '?' 的所有情况中,使得使用 str2 所有的操作,能到达   经过 str1 所有操作后到达的最终位置   的概率是多少。(额....比较拗口= =,俺的...表达能力果然不敢恭维- -!)

        首先,算出经过 str1 所有的操作后最终到达的位置,这个明显是确定的啦,没有 '?' 嘛。接着算出 str2 除 '?' 外到达的位置,剩下用深搜来填入 '?',统计等于最终位置的种数。最后用  这个种数 / 问号能填入的所有情况,就是答案啦!!!

        还有一些特判点,假如str2 没有问号,概率只有两种情况:1 或者 0。其他就要dfs算啦~~

        粗心过头,wa了两次: 无用%.12lf(又到考眼力的时候了= =) 还有调试 cnt 不记得注释了= =......

       

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 10 + 5;
     9 char str1[maxn], str2[maxn];
    10 int unknown, origin;
    11 double cnt, fenmu;
    12 
    13 void dfs(int c, int cur)
    14 {
    15     if (c == unknown)
    16     {
    17         if (cur == origin)
    18             cnt++;
    19         return;
    20     }
    21     dfs(c+1, cur+1);
    22     dfs(c+1, cur-1);
    23 }
    24 
    25 int main()
    26 {
    27     #ifndef ONLINE_JUDGE
    28         freopen("input.txt", "r", stdin);
    29     #endif
    30 
    31     while (scanf("%s%s", str1, str2) != EOF)
    32     {
    33         int len = strlen(str1);
    34         origin = 0;
    35 
    36         for (int i = 0; i < len; i++)
    37         {
    38             if (str1[i] == '+')
    39                 origin += 1;
    40             else
    41                 origin -= 1;
    42         }
    43 
    44         int known = 0;
    45         unknown = 0;
    46         for (int i = 0; i < len; i++)
    47         {
    48             if (str2[i] == '?')
    49                 unknown++;
    50             else if (str2[i] == '+')
    51                 known += 1;
    52             else if (str2[i] == '-')
    53                 known -= 1;
    54         }
    55         if (!unknown)
    56         {
    57             if (known != origin)
    58                 printf("0.000000000000
    ");
    59             else
    60                 printf("1.000000000000
    ");
    61         }
    62         else
    63         {
    64             cnt = 0;
    65             dfs(0, known);
    66             fenmu = 1;
    67             for (int i = 1; i <= unknown; i++)
    68                 fenmu *= 2;
    69             printf("%.12lf
    ", (double)cnt/(double)fenmu);
    70         }
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    ER/数据库建模工具之MySQL Workbench的使用
    HBase基础架构及原理
    HBase在HDFS上的目录介绍
    zookeeper的三种安装模式
    YCSB之HBase性能测试
    kerberos简单介绍
    springboot 文件上传大小配置
    List集合三种遍历方法
    Linux中给普通用户添加sudo权限
    Linux查看所有用户和组信息
  • 原文地址:https://www.cnblogs.com/windysai/p/4023090.html
Copyright © 2020-2023  润新知