【bitset模板题】HDU 5036 Explosion

题意:

一个人要打开或者用炸弹砸开所有的门,每个门里面有一些钥匙,一个钥匙对应一个门,有了一个门的钥匙就能打开相应的门,告诉每个门里面有哪些门的钥匙,问用的炸弹为期望值。

分析:

期望值 = 每个门用炸弹炸开的概率之和

而 每个门用炸弹炸开的概率 = 1 / 到达这个门的方案数, 因为炸开门的方案只有一种

我们用bitset记录门间的联通情况,求出方案数即可

我们开一个bitset数组 a

假如  a[i] = 0  1  0  1  1  0  1          即 i 号门能到 1 3 4 6 号门

a[j] = 1  0  0  1  0  1  0

如果 j 能到 i ,那么 j 本来能到的现在还能到, i 能到的 j 也能到

也就是我们把   a[j] |= a[i] 即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bitset>
using namespace std;
const int maxn = 1005;
bitset<maxn> a[maxn];
int main() {
    int t; scanf("%d", &t);
    for(int cnt=1; cnt<=t; cnt++){
        int n; scanf("%d", &n);
        for(int i=0; i<n; i++){
            a[i].reset();       //这里记得初始化
            a[i][i] = 1;       //自己到自己是联通的
        }
        for(int i=0; i<n; i++){
            int k; scanf("%d", &k);
            while(k--){
                int x; scanf("%d", &x);
                a[i][--x] = 1;//我们的下标统一从0开始,所以 --x
            }
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(a[j][i]) a[j] |= a[i]; //i能到达的j也能到达
            }
        }
        double ans = 0;
        int tot = 0;
        for(int i=0; i<n; i++){
            tot = 0;
            for(int j=0; j<n; j++){
                if(a[j][i]) tot ++;//求方案数
            }
            ans += 1.0/tot; //更新期望值
        }
        printf("Case #%d: %.5lf\n", cnt, ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hzoi-poozhai/p/12681300.html

时间: 2024-10-31 11:26:43

【bitset模板题】HDU 5036 Explosion的相关文章

HDU 5036 Explosion(北京网络赛E题)

HDU 5036 Explosion 题目链接 思路:对于每个点,只要考虑哪些炸掉能到他的个数cnt,那么他对应的期望就是1 / cnt,然后所以期望的和就是答案,用bitset来维护 代码: #include <cstdio> #include <cstring> #include <bitset> using namespace std; const int N = 1005; int t, n; bitset<N> bs[N]; int main()

AC自动机 - 多模式串匹配问题的基本运用 + 模板题 --- HDU 2222

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 35655    Accepted Submission(s): 11496 Problem Description In the modern time, Search engine came into the life of everybody like

迪杰斯特拉算法 最短路径模板题 hdu 2544

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 36954    Accepted Submission(s): 16091 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

匈牙利算法模板题 hdu 1150

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6339    Accepted Submission(s): 3178 Problem Description As we all know, machine scheduling is a very classical problem in compu

hdu 5036 Explosion bitset优化floyd

http://acm.hdu.edu.cn/showproblem.php?pid=5036 题意就是给定一副有向图,现在需要走遍这n个顶点,一开始出发的顶点是这n个之中的随便一个. 如果走了1,那么1能联通的顶点就可以直接走过去,其他不和1连通的,就需要炸坏.问需要炸弹的期望. 比如一副图是1-->2-->3的.那么期望是11 / 6 假如从1号点开始,1/3概率选中1号点开始,那么需要炸弹数是1(炸开一号),贡献是1/3 假如从2号点开始,1/3概率选中2号点开始,那么需要炸开2号点,然后

hdu 5036 Explosion (bitset优化的传递闭包求解概率)

Explosion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 142    Accepted Submission(s): 25 Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a g

hdu 5036 Explosion(概率期望+bitset)

Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a game. There are N rooms, each with one door. There are some keys(could be none) in each room corresponding to some doors among these N doors. Every key

HDU 5036 Explosion (传递闭包+bitset优化)

<题目链接> 题目大意: 一个人要打开或者用炸弹砸开所有的门,每个门后面有一些钥匙,一个钥匙对应一个门,告诉每个门里面有哪些门的钥匙.如果要打开所有的门,问需要用的炸弹数量为多少. 解题分析:因为许多门和他们之后的钥匙可能形成闭包的关系,所以,对于所有的闭包而言,只需要炸毁其中的一个门,就可以用其后面的钥匙打开闭包中至少一扇另外的门,一次类推.所以,假设闭包中包含$num$扇门,用炸弹打开闭包中任意一扇门的概率就为:$1/num$(因为炸毁每个闭包的概率为1,即每个闭包必然需要一枚炸弹).所有

HDU - 5036 Explosion

Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a game. There are N rooms, each with one door. There are some keys(could be none) in each room corresponding to some doors among these N doors. Every key