题解:
任何时候所拥有的球的状态是一个整数划分,且不超过
T
T
,打表发现不过种左右。 进一步发现这些关系形成了一棵树, 然后就是经典的树形期望DP,令
Ei=kEfai+b
E
i
=
k
E
f
a
i
+
b
即可在
O(n)
O
(
n
)
的时间内解决。
#include <bits/stdc++.h>
using namespace std;
typedef pair <double,double> pii;
inline pii operator -(const pii &a,const pii &b) {return pii(a.first-b.first,a.second-b.second);}
inline pii operator +(const pii &a,const pii &b) {return pii(a.first+b.first,a.second+b.second);}
inline pii operator *(const pii &a,const double &b) {return pii(a.first*b,a.second*b);}
inline pii operator /(const pii &a,const double &b) {return pii(a.first/b,a.second/b);}
double p; int L,n;
double a[55];
inline pii dfs(int pos,int sum) {
if(sum>L) return pii(0,0);
pii s(0,0); double per=(sum ? p : 0);
for(int i=1;i<=pos;i++)
s=s+dfs(i,sum+a[i])*(1.0-per)/pos;
s.second+=1.0;
s=pii(1,0)-s;
return pii(per/s.first,-s.second/s.first);
}
int main() {
while(scanf("%lf%d%d",&p,&L,&n)!=EOF) {
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
sort(a+1,a+n+1);
printf("%.3f\n",dfs(n,0).second);
}
}