Card Collector

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1708 Accepted Submission(s): 780
Special Judge

Problem Description
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in the famous novel Water Margin, you will win an amazing award.

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.

 
Input
The first line of each test case contains one integer N (1 <= N <= 20), indicating the number of different cards you need the collect. The second line contains N numbers p1, p2, ..., pN, (p1 + p2 + ... + pN <= 1), indicating the possibility of each card to appear in a bag of snacks.

Note there is at most one card in a bag of snacks. And it is possible that there is nothing in the bag.

 
Output
Output one number for each test case, indicating the expected number of bags to buy to collect all the N different cards.

You will get accepted if the difference between your answer and the standard answer is no more that 10^-4.

 
Sample Input
1
0.1
2
0.1 0.4
 
Sample Output
10.000
10.500
 
Source
当时看到,这一题,一点思路都没有啊,后来,发现是用容斥原理,这个表示没用过,补上这个知识点!
#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;
}

最新文章

  1. UED双飞翼布局
  2. 让你fork下来的项目与源项目保持同步
  3. android 获取文件夹、文件的大小 以B、KB、MB、GB 为单位
  4. Android Framework层Power键关机流程(一,Power长按键操作处理)
  5. NBUT 1010 魔法少女(DP)
  6. 【crunch bang】安装firefox,删除iceweasel
  7. Struts+Spring+Hibernate整合入门详解
  8. oc和swift的混编
  9. Android真机抓屏- Android Screen Monitor
  10. 由 Windows 向 Linux 迁移字体 和 Linux 等宽字体
  11. quartz学习笔记(一)简单入门
  12. 记一次jar包冲突
  13. 预处理指令--C语言
  14. gitlab+PHP 自动部署设计方案
  15. js(含有for if函数)
  16. 【转】IO多路复用机制详解
  17. Python脱产8期 Day03 2019/4/15
  18. 序列化 (实现RPC的基础)
  19. R绘图 第四篇:绘制箱图(ggplot2)
  20. luogu1312

热门文章

  1. Struts学习之自定义拦截器
  2. selenium css(转)
  3. LNNVL函数使用
  4. 练习:一只豆瓣电影TOP250的爬虫
  5. codeforces 242E. XOR on Segment 线段树
  6. (转)C++笔记:面向对象编程基础
  7. CodeForces 235C Cyclical Quest(后缀自动机)
  8. Java 初学者帮助文档以及基础教程
  9. Delphi Excel FastReport
  10. SGU 319 Kalevich Strikes Back(线段树扫描线)