惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
F
Fortinet All Blogs
J
Java Code Geeks
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
M
MIT News - Artificial intelligence
腾讯CDC
Last Week in AI
Last Week in AI
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园 - 叶小钗
Recent Announcements
Recent Announcements
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
人人都是产品经理
人人都是产品经理
L
LangChain Blog
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
HDU 4336.Card Collector|OhYee 博客
2017-08-14 · via OhYee 博客

这是一篇最后编辑于 8 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

题目

{% fold 点击显/隐题目 %}

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.

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 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.

1 0.1 2 0.1 0.4

10.000 10.500

{% endfold %}

题解

这题需要用到容斥原理

在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。

对于样例(0.1 0.4)而言
我们可以分别单独只看第一种卡片和第二种卡片
得到第一种卡片的期望包数为1 / 0.1 = 10
第二种卡片的期望包数为1 / 0.4 = 2.5
那么需要的总天数为 10 + 2.5 = 12.5

显然,10天内我们直接认为第二种不会出现,2.5天直接认为第一种不会出现
需要减去两种同时会出现的情况
两种同时出现的概率是 0.1 + 0.5 = 0.5
期望为 1 / 0.5 = 2
减去得 12.5 - 2 = 10.5

而对于有更多种卡片呢?

如图,我们直接计算相当于重复计算了绿色区域
而减去绿色区域时又发现多减了中间区域

因此,应该从所有组合中,选取k个概率相加,算出这个概率得期望
如果k是奇数应该加到结果里,如果是偶数则应该减去
也即奇加偶减

代码

{% fold 点击显/隐代码 %}```cpp Card Collector https://github.com/OhYee/sourcecode/tree/master/ACM 代码备份
#include
const int maxn = 25;
double p[maxn];

inline bool GetI(int num, int i) { return (num >> i) & 1; }

int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++)
scanf("%lf", &p[i]);

    double ans = 0.0;
    for (int state = (1 << n) - 1; state > 0; --state) {
        bool cnt = false;
        double sump = 0.0;
        for (int i = 0; i < n; i++) {
            bool t = GetI(state, i);
            if (t) {
                cnt = !cnt;
                sump += p[i];
            }
        }
        if (cnt) {
            ans += 1.0 / sump;
        } else {
            ans -= 1.0 / sump;
        }
    }
    printf("%f\n", ans);
}
return 0;

}

{% endfold %}