【HDU4336】Card Collector(Min-Max容斥)

题面

Vjudge

题解

原来似乎写过一种状压的做法,然后空间复杂度很不优秀。

今天来补一种神奇的方法。


给定集合\(S\),设\(max\{S\}\)为\(S\)中的最大值,\(min\{S\}\)为集合\(S\)中的最小值。

那么我们可以得到:

\(max\{S\}=\sum_{T\subseteq S}(-1)^{|T|+1}min\{T\}\)

证明的话,大概就是如果你钦定一个最小值,并且它强制出现,

如果枚举所有子集,不难证明除了最大值之外,任何一个数的出现次数都是\(2^k\)的形式。

并且子集大小的奇偶性一一对应。因此,除了最大值之外,任何一个值的贡献全部会互相抵消,最后剩下的值就只有最大值。

对于期望而言这样做也是正确的。


回到这道题目,我们\(max\{S\}\)表示集合中最晚出现的元素,\(min\)同理。

\(E(max\{S\})\)表示出现时间的期望。

那么我们要求的是\(E(max\{\)全集\(\})\),那么利用\(min-max\)容斥,有:

\(E(max\{S\})=\sum_{T\subseteq S}(-1)^{|T|+1}E(min\{T\})\)

而\(E(min\{T\})=\frac{1}{\sum_{i\in T}p_i}\)

那么枚举子集,直接\(dfs\)实现就好了

#include<cstdio>
int n;
double p[20],ans;
void dfs(int x,double e,int opt)
{
if(x>=n){if(e>1e-7)ans+=opt/e;return;}
dfs(x+1,e,opt);dfs(x+1,e+p[x],-opt);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;++i)scanf("%lf",&p[i]);
ans=0;dfs(0,0,-1);
printf("%.6lf\n",ans);
}
}

最新文章

  1. Webdriver配合Tesseract-OCR 自动识别简单的验证码
  2. sql 跨库查询备忘笔记
  3. Linux Ubuntu12.04下安装OpenCv2.4.10
  4. EF架构~有时使用SQL更方便
  5. MSMQ消息队列安装
  6. Android_使用 OpenVPN
  7. magento添加分类属性
  8. AgileEAS.NET SOA中间件平台/敏捷软件开发平台 and SQL详解
  9. js调试若干
  10. TP 3.2 笔记 (1)
  11. 本地phpstudy时常停机连接失败,php.ini文件中9000端口问题
  12. hdu-2141 Can you find it?---暴力+二分
  13. vue2-通过axios实现数据请求
  14. 2018-2019-2 20165315《网络攻防技术》Exp6 信息搜集与漏洞扫描
  15. JAVA EE 环境配置——JAVA8 下载安装和 Eclipse EE的下载安装
  16. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)
  17. 转:Ubuntu 10.10 安装后上不了网的原因
  18. golang yaml配置文件解析
  19. 009_【OS X和iOS系统学习笔记】 OS X架构
  20. SQL 教程数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等,您将学到如何使用 SQL 访问和处理数据系统中的数据

热门文章

  1. Eclipse Photon没有Server选项的问题
  2. Android Library和Android APP、Java Library的区别
  3. 通过扩展方法简化UnityAPI调用
  4. VM虚拟机系统时间同步网络时间并登录用户自动校正时间
  5. python 原生态调用server服务————SimpleHTTPServer
  6. linux, configure --prefix 的作用
  7. DWR、Comet4j在Nginx+Tomcat组合下的优化
  8. YQCB冲刺周第五天
  9. IO文件的读取,以及写入文件内容
  10. python learning Network Programming.py