zoukankan      html  css  js  c++  java
  • JLOI 2013 卡牌游戏 bzoj3191

    题目描述

    N个人坐成一圈玩游戏。一开始我们把所有玩家按顺时针从1到N编号。首先第一回合是玩家1作为庄家。每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏。然后卡片将会被放回卡牌堆里并重新洗牌。被处决的人按顺时针的下一个人将会作为下一轮的庄家。那么经过N-1轮后最后只会剩下一个人,即为本次游戏的胜者。现在你预先知道了总共有M张卡片,也知道每张卡片上的数字。现在你需要确定每个玩家胜出的概率。

    这里有一个简单的例子:

    例如一共有4个玩家,有四张卡片分别写着3,4,5,6.

    第一回合,庄家是玩家1,假设他选择了一张写着数字5的卡片。那么按顺时针数1,2,3,4,1,最后玩家1被踢出游戏。

    第二回合,庄家就是玩家1的下一个人,即玩家2.假设玩家2这次选择了一张数字6,那么2,3,4,2,3,4,玩家4被踢出游戏。

    第三回合,玩家2再一次成为庄家。如果这一次玩家2再次选了6,则玩家3被踢出游戏,最后的胜者就是玩家2.

    输入输出格式

    输入格式:
    第一行包括两个整数N,M分别表示玩家个数和卡牌总数。

    接下来一行是包含M个整数,分别给出每张卡片上写的数字。

    输出格式:
    输出一行包含N个百分比形式给出的实数,四舍五入到两位小数。分别给出从玩家1到玩家N的胜出概率,每个概率之间用空格隔开,最后不要有空格。

    输入输出样例

    输入样例#1: 复制
    5 5
    2 3 5 7 11
    输出样例#1: 复制
    22.72% 17.12% 15.36% 25.44% 19.36%
    输入样例#2: 复制
    4 4
    3 4 5 6
    输出样例#2: 复制
    25.00% 25.00% 25.00% 25.00%
    说明

    对于30%的数据,有1<=N<=10

    对于50%的数据,有1<=N<=30

    对于100%的数据,有1<=N<=50 1<=M<=50 1<=每张卡片上的数字<=50

    本题用概率dp,设dp[i][j]表示剩下i个人时,第j个人获胜的概率,被淘汰的人为c,可得转移方程:

    dp[i][j]=dp[i][j]+dp[i-1][j-c] (c < j )
    dp[i][j]=dp[i][j]+dp[i-1][i+j-c] (c>j)

    时间复杂度为O(n^2*m)

    #include<bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 55;
    
    int n,m,a[MAXN];
    double dp[MAXN][MAXN];
    
    int main(){
        scanf("%d%d",&n,&m);
        for(register int i=1;i<=m;i++)
            scanf("%d",&a[i]);
        dp[1][1]=1.0;
        for(register int i=2;i<=n;i++)
            for(register int j=1;j<=i;j++)
                for(register int k=1;k<=m;k++){
                    int pos=a[k]%i;
                    if(pos==0) pos=i;
                    if(pos>j)
                        dp[i][j]+=dp[i-1][i-pos+j]/m;
                    else
                        dp[i][j]+=dp[i-1][j-pos]/m;
                }
        for(register int i=1;i<=n;i++)
            printf("%.2lf%% ",dp[n][i]*100);
        return 0;
    }
  • 相关阅读:
    diary and html 文本颜色编辑,行距和其它编辑总汇
    bash coding to changeNames
    virtualbox ubuntu 网络连接 以及 连接 secureCRT
    linux 学习6 软件包安装
    linux 学习8 权限管理
    vim 使用2 转载 为了打开方便
    ubuntu
    linux 学习15 16 启动管理,备份和恢复
    linux 学习 14 日志管理
    linux 学习 13 系统管理
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677104.html
Copyright © 2011-2022 走看看