Card Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3014 Accepted Submission(s): 1445
Special Judge
As a smart boy, you notice that to win the award, you must buy much more snacks than it seems to be. To convince your friends not to waste money any more, you should find the expected number of snacks one should buy to collect a full suit of cards.
Note there is at most one card in a bag of snacks. And it is possible that there is nothing in the bag.
You will get accepted if the difference between your answer and the standard answer is no more that 10^-4.
1 0.1 2 0.1 0.4
10.000 10.500
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b) for(i = a; i <b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 21
double dp[1<<N];
double p[N];
int n;
int main()
{
int i,j;
while(~sf(n))
{
mem(dp,0);
double te=0;
for(i=0;i<n;i++)
{
scanf("%lf",&p[i]);
te+=p[i];
}
te=1-te;
int len=1<<n;
for(i=len-2;i>=0;i--)
{
double x=0;
double s=1;
for(j=0;j<n;j++)
{
if(i&(1<<j)) x+=p[j];
else
s+=p[j]*dp[i|(1<<j)];
}
dp[i]=s/(1-x-te);
}
pf("%.4f\n",dp[0]);
}
return 0;
}
1万+



被折叠的 条评论
为什么被折叠?



