cf#301"/>
cf#301
题意:给三种人,分别是r,s,p个;
在孤岛上,
每两个不同种人相遇则互吃,r吃s,s吃p,p吃r
求最后留下单一种族的概率
设dp[i][j][k]为 剩下i个r,j个s,k个p 的概率,那么可以得到
当r和p相遇,dp[i-1][j][k]+=dp[i][j][k]*(i*k)/(i*j+j*k+k*i);
同理推出另外2种相遇情况
注意控制条件即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;const double pi=acos(-1.0);
double eps=0.000001;
int min(int a,int b)
{return a<b?a:b;}
int max(int a,int b)
{return a>b?a:b;}double dp[105][105][105];
int main()
{ int r,s,p;
cin>>r>>s>>p;
int i,j,k;
dp[r][s][p]=1;
for (i=r;i>=0;i--)
{for (j=s;j>=0;j--){for (k=p;k>=0;k--){if (dp[i][j][k]==0)continue;int kind=0;if (i)kind++;if (j)kind++;if (k)kind++;if (kind==1)continue;if (i>0)dp[i-1][j][k]+=dp[i][j][k]*(i*k)/(i*j+j*k+k*i);if (j>0)dp[i][j-1][k]+=dp[i][j][k]*(i*j)/(i*j+j*k+k*i);if (k>0)dp[i][j][k-1]+=dp[i][j][k]*(k*j)/(i*j+j*k+k*i);}}
}double a1=0,a2=0,a3=0;
for (i=1;i<=r;i++) a1+=dp[i][0][0];
for (i=1;i<=s;i++) a2+=dp[0][i][0];
for (i=1;i<=p;i++) a3+=dp[0][0][i];
printf("%.9lf %.9lf %.9lf\n",a1,a2,a3);return 0;}
更多推荐
cf#301
发布评论