POJ 3682 King Arthur's Birthday Celebration

Problem

POJ
正面的概率为p,掷k次正面就停止,求期望掷多少次。

Solution

设f[i]表示掷i次的期望

f[i]=1+pf[i+1]+(1p)f[i] f [ i ] = 1 + p ∗ f [ i + 1 ] + ( 1 − p ) f [ i ]

f[i]=1p+f[i+1] f [ i ] = 1 p + f [ i + 1 ]

f[k]=0f[i]=kip f [ k ] = 0 ⇒ f [ i ] = k − i p

可得 f[0]=kp f [ 0 ] = k p


设g[i]表示对天数加权后掷i次的期望

g[i]=pg[i+1]+(1p)g[i]+2f[i]1 g [ i ] = p ∗ g [ i + 1 ] + ( 1 − p ) g [ i ] + 2 f [ i ] − 1

g[i]=g[i+1]+2(ki)p21p g [ i ] = g [ i + 1 ] + 2 ( k − i ) p 2 − 1 p

上求和公式可得 g[0]=k(kp+1)p2 g [ 0 ] = k ( k − p + 1 ) p 2

但是如果代价是一个与天数有关的二阶(或更高)的函数关系,那么就不能直接写成 +f[i]2 + f [ i ] 2 了。因为期望可以理解为是平均情况下的代价,而平均情况的平方和先平方再求平均是不一样的。

不知道为什么语言选G++就WA,C++才A的。。

Code

#include 
#define rg register
using namespace std;
typedef long long ll;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') f=1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    if(f) x=-x;
}
int k;
double p;
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    while(~scanf("%d",&k)&&k)
    {
        scanf("%lf",&p);
        printf("%.3lf %.3lf\n",k/p,1.0*k*(k+1.0-p)/p/p);
    }
    return 0;
}

你可能感兴趣的:(=====动态规划=====,=====数学=====,概率与期望)