51Nod - 1398 等公交

51Nod - 1398 等公交_第1张图片51Nod - 1398 等公交_第2张图片

题解

这题是比较基础的概率DP题。定义f[i]表示第i个时刻的所有的情况的概率和。f[i]由 f[itime[j]] 来转移就好了。最后枚举一下在他上车之前的最后一辆车是那一辆*他等的时间就好了。
代码如下:

#include
#include
using namespace std;
const int maxn=105,maxt=100005;
int T,n,s,a[maxn],p[maxn];
double ans,f[maxt];
inline int read(){
    int x=0; char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
    return x;
}
int main(){
    T=read();
    while (T--) {
        n=read(); s=read();
        for (int i=1;i<=n;i++) a[i]=read(),p[i]=read();
        for (int i=0;i<s;i++) f[i]=0.0;
        f[0]=1.0; ans=0;
        for (int i=1;i<s;i++)
        for (int j=1;j<=n;j++)
        if (i-a[j]>=0) f[i]+=1.0*p[j]*f[i-a[j]]/100.0;
        for (int i=0;i<s;i++)
        for (int j=1;j<=n;j++)
        if (i+a[j]>s) ans+=(i+a[j]-s)*f[i]*p[j]/100.0;
        printf("%.4lf\n",ans);
    }
    return 0;
}

你可能感兴趣的:(dp,题解,51nod题解)