51nod 1450

来源:互联网 发布:淘宝客服工作目标 编辑:程序博客网 时间:2024/05/29 08:52

得到2颗星的期望次数可以解方程算但得到1颗星的算不了。
因为每关都要通过,我们按Yi从小到大处理,f[i][j],pi[i][j]表示玩了i关,获得了j颗星的期望次数,概率
如果(n-i)*2=m-j,那接下来每关都要玩2星,也只会在这些关弄2星因为他们的Yi最大
否则我们只要求通过就行了
通过的期望次数是能算的,通过了后获得1/2颗星的期望是Xi:Yi,就可以dp了

code:

#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn = 2010;const int maxm = 4010;int n,m;struct node{int x,y;}a[maxn];inline bool cmp(const node x,const node y){return x.y<y.y;}double f[maxn][maxm],pi[maxn][maxm];int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);    sort(a+1,a+n+1,cmp);    f[0][0]=0.0; pi[0][0]=1.0;    for(int i=1;i<=n;i++)    {        double x=(double)a[i].x/1000.0,y=(double)a[i].y/1000.0;        double p=1.0/(x+y),p2=1.0/y;        double px=x/(x+y),py=y/(x+y);        for(int j=i-1;j<=2*n;j++)        {            double lp=pi[i-1][j],tmp=f[i-1][j];            if(2*(n-i+1)==m-j) f[i][j+2]+=tmp+p2*lp,pi[i][j+2]+=lp;            else            {                f[i][j+1]+=tmp*px+p*px*lp,pi[i][j+1]+=lp*px;                f[i][j+2]+=tmp*py+p*py*lp,pi[i][j+2]+=lp*py;            }        }    }    double ans=0.0;    for(int i=m;i<=2*n;i++) ans+=f[n][i];    printf("%.8lf\n",ans);    return 0;}
原创粉丝点击