• Bad Luck Island CodeForces


    题意

    一座岛上有三个种族的人,分别是paper, scissors, rock。

    他们之间任意两人会接触。

    如果他们不属于同一种族,那么他们按照石头剪子布的规则,败的人被杀死。

    求岛上只剩下某一种族的人的概率。

    分析

    似乎可以跑三维DP, 因为每种人都最多100个。

    (dp[i][j][k])表示三种人分别有(i)个,(j)个,(k)个的状态的概率。

    答案就是某种种族人数大于(0),其余种族人数为(0)的概率之和。

    考虑(dp[i][j][k])转移

    有用的转移的总方案数为(i * k + j * k + i * j)

    接着分别考虑转移到(dp[i -1][j][k], dp[i][j - 1][k], dp[i][j][k - 1])的贡献。

    code

    #include<bits/stdc++.h>
    using namespace std;
    #define ld long double 
    int r,s,p;
    ld dp[105][105][105];
    ld ans[4];
    int main(){
        scanf("%d%d%d",&r,&s,&p);
        dp[r][s][p] = 1;
        for(int i = r; i >= 0; -- i)
        for(int j = s; j >= 0; -- j)
        for(int k = p; k >= 0; -- k)
        if(dp[i][j][k] > 0){
             int fm = i * j + j * k + i * k;
             if(fm == 0) continue;
             if(i) dp[i - 1][j][k] += dp[i][j][k] * i * k / fm;
             if(j) dp[i][j - 1][k] += dp[i][j][k] * j * i / fm;
             if(k) dp[i][j][k - 1] += dp[i][j][k] * k * j / fm;
        }
        for(int i = 1; i <= r; ++ i) ans[1] += dp[i][0][0];
        for(int i = 1; i <= s; ++ i) ans[2] += dp[0][i][0];
        for(int i = 1; i <= p; ++ i) ans[3] += dp[0][0][i];
        for(int i = 1; i <= 3; ++ i) printf("%.12Lf
    ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    使用DBCP时发生AbstractMethodError异常
    Android NDK 环境搭建 + 测试例程
    一个关于含有显式实参的虚函数调用问题解释
    cookie和session
    hello
    python 多线程多进程
    python 网络编程
    docker 制作镜像
    docker 数据卷存储
    docker 简单原理及相关命令(镜像拉取 删除 执行容器 进入容器)
  • 原文地址:https://www.cnblogs.com/zzhzzh123/p/13472021.html
Copyright © 2020-2023  润新知