【HDU4336】Card Collector(Min-Max容斥)
2024-10-21 05:16:21
【HDU4336】Card Collector(Min-Max容斥)
题面
题解
原来似乎写过一种状压的做法,然后空间复杂度很不优秀。
今天来补一种神奇的方法。
给定集合\(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);
}
}
最新文章
- Webdriver配合Tesseract-OCR 自动识别简单的验证码
- sql 跨库查询备忘笔记
- Linux Ubuntu12.04下安装OpenCv2.4.10
- EF架构~有时使用SQL更方便
- MSMQ消息队列安装
- Android_使用 OpenVPN
- magento添加分类属性
- AgileEAS.NET SOA中间件平台/敏捷软件开发平台 and SQL详解
- js调试若干
- TP 3.2 笔记 (1)
- 本地phpstudy时常停机连接失败,php.ini文件中9000端口问题
- hdu-2141 Can you find it?---暴力+二分
- vue2-通过axios实现数据请求
- 2018-2019-2 20165315《网络攻防技术》Exp6 信息搜集与漏洞扫描
- JAVA EE 环境配置——JAVA8 下载安装和 Eclipse EE的下载安装
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)
- 转:Ubuntu 10.10 安装后上不了网的原因
- golang yaml配置文件解析
- 009_【OS X和iOS系统学习笔记】 OS X架构
- SQL 教程数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等,您将学到如何使用 SQL 访问和处理数据系统中的数据
热门文章
- Eclipse Photon没有Server选项的问题
- Android Library和Android APP、Java Library的区别
- 通过扩展方法简化UnityAPI调用
- VM虚拟机系统时间同步网络时间并登录用户自动校正时间
- python 原生态调用server服务————SimpleHTTPServer
- linux, configure --prefix 的作用
- DWR、Comet4j在Nginx+Tomcat组合下的优化
- YQCB冲刺周第五天
- IO文件的读取,以及写入文件内容
- python learning Network Programming.py