这题是比较基础的概率DP题。定义f[i]表示第i个时刻的所有的情况的概率和。f[i]由 ∑f[i−time[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;
}