Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1708 Accepted Submission(s): 780
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.
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; double p[25]; int main() { int n,i,flag,j,k,all,cnt; double sum,s,temp; while(scanf("%d",&n)!=EOF) { flag=1; for(i=0;i<n;i++) { scanf("%lf",&p[i]); } sum=0; flag=1; all=1<<n; for(i=1;i<all;i++) { cnt=0; temp=0; for(j=0;j<n;j++) { if(i&(1<<j))//相交 { temp+=p[j];cnt++; } } if(cnt&1)//奇加偶减 sum+=1.0/temp; else sum-=1.0/temp; } printf("%.4f\n",sum); } return 0; }
再来一个状态压缩dp,这里我们可以推出dp[n]=1+all dp[n](空的)+all dp[n](重复的)+all dp[k](没有但是加一个就有了);这样就好做了,好像这一题还非要写成输出4位,输出3位还是错的,样例应该是有问题的!很坑啊,有木有!
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; double p[25],dp[1<<20]; int main () { int n,i,j,all; double allp,tempallp,sum; while(scanf("%d",&n)!=EOF) { allp=0; for(i=0;i<n;i++) { scanf("%lf",&p[i]); allp+=p[i]; } all=1<<n; dp[0]=0; for(i=1;i<all;i++) { tempallp=allp; sum=1;//买了一袋 for(j=0;j<n;j++) { if(i&(1<<j)) { sum+=p[j]*dp[i^(1<<j)]; } else { tempallp-=p[j]; } } dp[i]=sum/tempallp; } printf("%.4f\n",dp[all-1]); } return 0; }