hdu_3366 Passage
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m; double dp[1010][20],ans; struct edge{double p,q;}a[1010]; bool cmp(edge x,edge y){return x.p/x.q>y.p/y.q;} int main(){ int T; scanf("%d",&T); for(int t=1;t<=T;t++){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].p,&a[i].q); ans=0; memset(dp,0,sizeof(dp)); sort(a+1,a+n+1,cmp); dp[1][m]=1.0; for(int i=1;i<=n;i++) for(int j=m;j>=0;j--){ dp[i+1][j-1]+=dp[i][j]*a[i].q; dp[i+1][j]+=dp[i][j]*(1.0-a[i].p-a[i].q); ans+=dp[i][j]*a[i].p; } printf("Case %d: %.5lf\n",t,ans); } return 0; }