题面
题解
原来似乎写过一种状压的做法,然后空间复杂度很不优秀。
今天来补一种神奇的方法。
给定集合
S
S
,设为
S
S
中的最大值,为集合
S
S
中的最小值。
那么我们可以得到:
证明的话,大概就是如果你钦定一个最小值,并且它强制出现,
如果枚举所有子集,不难证明除了最大值之外,任何一个数的出现次数都是
2k
2
k
的形式。
并且子集大小的奇偶性一一对应。因此,除了最大值之外,任何一个值的贡献全部会互相抵消,最后剩下的值就只有最大值。
对于期望而言这样做也是正确的。
回到这道题目,我们
max{S}
m
a
x
{
S
}
表示集合中最晚出现的元素,
min
m
i
n
同理。
E(max{S})
E
(
m
a
x
{
S
}
)
表示出现时间的期望。
那么我们要求的是
E(max{
E
(
m
a
x
{
全集
})
}
)
,那么利用
min−max
m
i
n
−
m
a
x
容斥,有:
E(max{S})=∑T⊆S(−1)TE(min{T})
E
(
m
a
x
{
S
}
)
=
∑
T
⊆
S
(
−
1
)
T
E
(
m
i
n
{
T
}
)
而
E(min{T})=1∑i∈Tpi
E
(
m
i
n
{
T
}
)
=
1
∑
i
∈
T
p
i
那么枚举子集,直接
dfs
d
f
s
实现就好了
#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);
}
}