码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Gym 101174 J Risky Lottery 计算方法 逼近求值 dfs

时间:2018-09-27 10:30:38      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:i++   stdio.h   bre   using   namespace   print   ott   code   efi   

 #include<stdio.h>
#include <math.h>
using namespace std;
int fac[10],a[10];
#define db  double
db p[10],f[10];
int n,m;
void dfs(int now,int remain) 
{
    if(now==m)
    {
        a[now]=remain; //dfs出
        int tmp=fac[n-1];
        for(int i=1;i<=m;i++)tmp/=fac[a[i]];
        db poss=tmp;
        for(int i=1;i<=m;i++) poss*=pow(p[i],a[i]); //n-1个人发生给定A的选数情况下的概率是 ∏pi^ai * (n-1)! /(∏ai!)
        for(int i=1;i<=m;i++)
        {
            if(!a[i])
            f[i]+=poss;
            else if(a[i]==1)break;
        }
        return ;
    }
    for(int i=0;i<=remain;i++)
    {
        a[now]=i;
        dfs(now+1,remain-i);
    }
}
bool check()
{
    int mx=1;
    for(int i=1;i<=m;i++)
        if(f[i]>f[mx])mx=i;
    for(int i=1;i<=m;i++)
        if(fabs(f[i]-f[mx])>1e-6)return false;
    return true;
}
int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    fac[0]=1;
    for(int i=1;i<10;i++)   fac[i]=fac[i-1]*i;
    for(int i=1;i<=m;i++)   p[i]=1./m;
    db o=10;
    do
    {
        for(int i=1;i<=m;i++) f[i]=0;
        dfs(1,n-1);
        o*=1.001;
        for(int i=1;i<m;i++)
        {
            p[i]+=(f[i]-f[i+1])/o,p[i+1]-=(f[i]-f[i+1])/o;
        }
    }while(!check());
    for(int i=1;i<=m;i++)
        printf("%.5f\n",(double)p[i]);
    return 0;
}

 

Codeforces Gym 101174 J Risky Lottery 计算方法 逼近求值 dfs

标签:i++   stdio.h   bre   using   namespace   print   ott   code   efi   

原文地址:https://www.cnblogs.com/polya/p/9711043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!