zoukankan      html  css  js  c++  java
  • 【BZOJ3191】[JLOI2013]卡牌游戏 概率DP

    【BZOJ3191】[JLOI2013]卡牌游戏

    Description

    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.

    Input

    第一行包括两个整数N,M分别表示玩家个数和卡牌总数。
    接下来一行是包含M个整数,分别给出每张卡片上写的数字。

    Output

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

    Sample Input

    5 5
    2 3 5 7 11

    Sample Output

    22.72% 17.12% 15.36% 25.44% 19.36%

    输入样例2:
    4 4
    3 4 5 6

    HINT

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

    题解:用f[i][j]表示i个人,第1个人坐庄,j的获胜概率。然后n^3转移就行了,细节有点多。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    int n,m;
    int v[60];
    double f[60][60];
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    int main()
    {
    	n=rd(),m=rd();
    	int i,j,k,d;
    	for(i=1;i<=m;i++)	v[i]=rd();
    	f[1][0]=100;
    	for(i=2;i<=n;i++)
    	{
    		for(k=1;k<=m;k++)
    		{
    			d=(v[k]-1)%i;
    			for(j=0;j<i;j++)	if(j!=d)	f[i][j]+=f[i-1][(j+i-d-1)%i]/m;
    		}
    	}
    	for(i=0;i<n;i++)	printf("%.2lf%%%c",f[n][i],i==n-1?'
    ':' ');
    	return 0;
    }
  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7536501.html
Copyright © 2011-2022 走看看