HDU 5036 期望+传递闭包+bitset优化
来源:互联网 发布:freehand mx for mac 编辑:程序博客网 时间:2024/05/26 12:58
题意:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5036
给出n个门,每个门之后有一些钥匙,每个钥匙对应一扇门,可以用钥匙打开门或者用炸弹炸开门,问在任意情况下,打开所有门所使用炸弹次数的期望是多少?
思路:
对于一个门来说,如果可以求出有k个门打开后,就可以到达他,那么只炸一次,就能打开这个门的概率为k/n,因为这里考虑的是任意选择门,也就有可能包括同一个门被炸多次,所以这个门能炸开的概率不变,都是k/n,因此期望为n/k,也就是期望炸n/k次,可以打开这扇门。考虑期望的线性可加性,因此所有门都打开总共的期望就是所有期望的总和,再除以n。
对于有多少点可达这个门,可以转化为传递闭包的问题,利用O(n^3)的warshall算法求解,这里利用bitset优化,复杂度为O(n^3/32)。
代码:
#include <bits/stdc++.h>using namespace std;const int MAXN = 1005;bitset <MAXN> key[MAXN];int main() { int T, cs = 0; scanf("%d", &T); while (T--) { int n, k; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &k); key[i].reset(); key[i][i] = true; for (int j = 1; j <= k; j++) { int x; scanf("%d", &x); key[i][x - 1] = true; } } for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) { if (key[i][j]) key[i] |= key[j]; } } double ans = 0; for (int i = 0; i < n; i++) { int cnt = 0; for (int j = 0; j < n; j++) { if (key[j][i]) ++cnt; } ans += 1.0 / cnt; } printf("Case #%d: %.5f\n", ++cs, ans); } return 0;}
阅读全文
0 0
- HDU 5036 期望+传递闭包+bitset优化
- hdu 5036 Explosion (bitset优化的传递闭包求解概率)
- bitset优化Floyd求传递闭包
- hdu 5036 概率+期望+bitset优化
- hdu 5036 Explosion (期望+传递闭包)
- 【传递闭包+bitset优化】BZOJ2208 [Jsoi2010]连通数
- hdu 5036 Explosion(有向图的删点期望+bitset优化)
- hdu 6085 bitset优化
- hdu 5506 bitset 优化
- hdu 6085(bitset优化)
- HDU 5961传递 思维 + bitset
- hdu 5745 dp+bitset优化
- HDU 5745 dp, bitset优化
- hdu 1704 传递闭包
- hdu 1704 传递闭包
- HDU-1074 传递闭包
- HDU-1181 传递闭包
- hdu 1181(传递闭包)
- Ubuntu 系统在DELL Win10上的安装
- ORA-15097: cannot SHUTDOWN ASM instance with connected client 和 ORA-01031: insufficient privileges 处
- Django配置mysql
- cvRound cvFloor cvCeil
- 周志华《机器学习》笔记:第1章 绪论
- HDU 5036 期望+传递闭包+bitset优化
- SQL中left join、right in、inner join的区别
- c# windows服务 启动外部程序,程序已开启,但看不到界面
- 常用的四种CSS样式表格
- Sprint Boot 打Jar包并启动
- win7进不了系统怎么办
- CentOS 7 之 hostapd.conf 配置说明
- ERROR spark.SparkContext: Error initializing SparkContext
- 测试java代码运行时间