[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);
}
}