[JLOI2013] 卡牌游戏

 

 [JLOI2013] 卡牌游戏

首先我们对题目进行观察发现,在我们进行选牌的时候会在特定轮回中枪毙一个人,随后,进行下一轮

我们会很自然的想到dp,但是,如果从头开始顺,会发现后面的每一种情况都会影响到前面的状态,这样就违反了我们进行DP的初心,甚至朴素做法会比DP更省时间

这怎么办呢?我们举一个栗子:牌为1,2,3,4,5

如果只剩一个人,那么这个人的胜率是百分之百

如果剩两个人,那么选到1,3,5时候,庄获胜,否则另一个人获胜,即:庄胜率为$ \frac 3 5$ ,二号胜率为 $\frac 2 5$

...

由此,我们不难看出,从后往前推的时候,每次状态转移并不会影响先前的状态,就可以进行很好的状态转移

#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
double f[maxn][maxn];
int ma[maxn];
int n,m;
int main()
{
	cin>>n>>m;
	f[1][1]=1.0;
	for(int i=1;i<=m;i++)
	{
		cin>>ma[i];
	}
	for(int i=2;i<=n;i++)
	{
		for(int k=1;k<=m;k++)
		{
			int p=(ma[k]%i==0)?i:ma[k]%i;
			for(int j=1;j<=i-1;j++)
			{
				++p;
				p=(p>i)?1:p;
				f[i][p]+=f[i-1][j]/(double)(m);
			}
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		printf("%.2lf%% ",f[n][i]*100.00);
	}
	
}
posted @ 2024-09-30 08:19  Jucex  阅读(2)  评论(0编辑  收藏  举报