记 $min\{S\}$ 为集合 $S$ 中最小值,$max\{S\}$ 为集合 $S$ 中最大值

则有 $max\{S\}=\sum\limits_{T \subseteq S,T \neq \emptyset}(-1)^{|T|-1}min\{T\}$

这个东西可以用来求“全都出现的期望时间”

 

hdu4336 Card Collector

有 n 种卡片,每秒你有 $P_i$ 的概率获得第 $i$ 张卡片,求获得所有卡片至少一张的期望时间

$n \leq 20$

sol:

直接套上面那个式子,令 $max\{S\}$ 为得到 $S$ 集合中最晚的一张的期望时间,易得这也是得到 $S$ 集合的期望时间

然后套一下式子,就只用对于 $S$ 的每一个子集 $T$ ,计算出至少得到一个 $T$ 中元素的期望时间

易得 $min\{T\}=\frac{1}{\sum\limits_{i \in T}P_i}$

然后就做完了

#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
    int x = 0,f = 1;char ch = getchar();
    for(;!isdigit(ch);ch = getchar())if(ch == '-') f = -f;
    for(;isdigit(ch);ch = getchar())x = 10 * x + ch - '0';
    return x * f;
}
int n;double p[25],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=1;i<=n;i++)cin >> p[i];
        ans = 0;dfs(1,0,-1);
        printf("%.6lf\n",ans);
    }
}
View Code

相关文章:

  • 2021-10-25
  • 2022-02-11
  • 2021-12-28
  • 2021-12-03
  • 2022-12-23
  • 2022-12-23
  • 2022-01-02
  • 2022-01-15
猜你喜欢
  • 2021-05-15
  • 2022-12-23
  • 2022-03-09
  • 2022-01-31
  • 2021-12-10
  • 2022-01-14
  • 2021-10-21
相关资源
相似解决方案