• A Dangerous Maze (II) LightOJ


    A Dangerous Maze (II) LightOJ - 1395(概率dp)


    这题是Light Oj 1027的加强版,1027那道是无记忆的。
    题意: 有n扇门,每次你可以选择其中一扇。xi为负值的门带你abs(xi)后又回到原点。xi为正值
    的门则带你离开迷宫,并且你会记住你前面选择的K道门,在下次选择的时候不会选择这些门。选择每扇门的概率相等。求走出迷宫的时间期望值。

    题解:
    (定义E[i] 表示记住了K道门后,显然这K道门都是为负值的门,走出迷宫的时间期望值,sum1表示为正的时间的和,sum2表示为负的时间的和,cnt表示为负的时间的个数)
    首先(K = min(cnt,K))
    若K == cnt,那么E[K]就相当于从正值门中随便选一道出去即可 $$E[K] = frac{sum1}{n-cnt}$$
    否则$$E[K] = frac{sum1}{n-K} + frac{sum{(T负)}+(cnt - K) cdot E[K]}{n - K}$$
    对于0 <= i < K 则有 $$E[i] = frac{sum1}{n - i} + frac{sum{(T负)}+(cnt - i) cdot E[i+1]}{n - i}$$

    (sum{(T负)}的意思是 在已经走过了K道负值门之后,再选择cnt - K道负值门的时间的和)
    但是前面的选择的K道负门 具体是怎样的我们并不知道,该怎么求呢

    再来一个问题假设有n个数,先选K个数,在从剩下的数里面选择一个数的平均值是多少呢?

    答案其实就是n个数的平均值
    n个数先选K个再选,可以等价于先从n个中选n-K个,再选一个
    考虑每个数的贡献,选完某个数,然后就从剩下n-1个中选n-k-1个呗
    平均值就等于 $$frac{frac{1}{n-k} cdot C(n-1,n-k-1) cdot sum{a_i} }{C(n,n-k)} = frac{sum{a_i}}{n} $$

    于是$$sum{T负} = frac{sum{a_负}}{cnt} cdot (cnt - i) $$

    将上式代入E[K],cnt != K那个式子化简后可得

    [E[K] = frac{sum1}{n - cnt} + frac{sum2 cdot (cnt - K)}{cnt cdot (n - cnt)} ]

    从后往前推 E[0]就是答案,注意特判cnt = n时永远无法逃出迷宫,输出-1

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    int main()
    {
        int T, cas = 1;
        cin>>T;
        while(T--){
            int n, K;
            scanf("%d%d",&n,&K);
            int cnt = 0,sum1 = 0,sum2 = 0, x;
            for(int i = 0;i < n;i++){
                scanf("%d",&x);
                if(x > 0) sum1 += x;
                else sum2 += -x,cnt++;
            }
    
            printf("Case %d: ",cas++);
            if(cnt == n) {
                printf("-1
    ");
                continue;
            }
            K = min(cnt,K);
            double ans = 0;
            if(cnt == K) ans = sum1 / 1.0 / (n - cnt);
            else ans = sum1 / 1.0 / (n - cnt) + sum2 * 1.0 * (cnt - K) / cnt / (n - cnt);
            for(int i = K - 1;i >= 0;i--) {
                    ans = sum1 * 1.0 / (n - i) + (sum2 * 1.0 / cnt + ans) * (cnt - i) / (n - i);
            }
            printf("%.12f
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理
    让Visual Studio 2015 支持ASP.NET MVC4.0.0.1
    自定义滚动条CSS样式
    使用NuGet发布自己的类库包(Library Package)
    基于EF的数据外键关联查询
    基于EF创建数据库迁移
    用SQL命令查看Mysql数据库大小
    Python之MySQL数据操作
    Python之MySQL基础
    Python网络编程之黏包问题
  • 原文地址:https://www.cnblogs.com/jiachinzhao/p/7210159.html
Copyright © 2020-2023  润新知