ural 1716

来源:互联网 发布:校园社区源码 编辑:程序博客网 时间:2024/06/07 16:09

代码一:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=5005;double dp[N][N];int main(){    int n,s;    cin>>n>>s;    int y=s-n-n,x=n-y;//    printf("%.7lf\n",1.0*(2*y+1)*x/(x+y));    for(int i=0;i<=x;++i)    {        for(int j=0;j<=y;++j)        {            if(i==0) dp[i][j]=0;            else if(j==0) dp[i][j]=1;            else dp[i][j]=(dp[i][j-1]*j+dp[i-1][j]*i+2.0*i*j/(i+j-1))/(i+j);        }    }    printf("%.7lf\n",dp[x][y]);    return 0;

代码二:

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cstdlib>#include <cmath>#include <queue>#include <vector>#include <map>#define pb push_back#define mp make_pair#define eps 1e-9#define zero(x) (fabs(x)<eps)#define pi acos(-1.0)#define f1 first#define f2 secondconst int inf=0x3f3f3f3f;const long long INF=1LL<<50;using namespace std;typedef long long LL;typedef pair <int,double> PII;#define N 5002double f[2][N][2];int n,s,no,ye;//f[n][yes][last]void doit(){   ye=s-n*2;    no=n-ye;    //printf("~~%d %d\n",no,ye);    memset(f,0,sizeof(f));    f[0][0][1]=1;    double ans=0;    for (int i=0;i<n;i++)    {int o=i&1;     memset(f[o^1],0,sizeof(f[o^1]));     for (int j=0;j<=ye;j++)        {   double p1,p0;            p1=(ye-j)/double (n-i);            p0=1-p1;            f[o^1][j+1][1]+=f[o][j][1]*p1;                 f[o^1][j][0]+=f[o][j][1]*p0; ans+=f[o][j][1]*p0;                            f[o^1][j+1][1]+=f[o][j][0]*p1; ans+=f[o][j][0]*p1;                              f[o^1][j][0]+=f[o][j][0]*p0;                           }    }    printf("%.7lf\n",ans);}int main(){    while (scanf("%d%d",&n,&s)!=EOF) doit();}


0 0