hdu 5036 概率+bitset

本文提供了一道来自HDU OJ编号为5036的题目解决方案,该题涉及多个房间与钥匙的问题。文章通过使用bitset进行高效的状态表示,并通过动态规划的思想来计算最少期望炸弹数。

http://acm.hdu.edu.cn/showproblem.php?pid=5036

n个房间每个房间里面有一把或多把钥匙可以打开其他的门。如果手上没有钥匙可以选择等概率随机选择一个门炸开,求用炸弹数的期望。

O(N^3)的复杂度过不了

单独考虑一个房间,如果有k个房间被炸开都会导致这个房间被打开。那么炸一次这个房间被打开的概率即为 kn 。也就意味着为了把这个房间打开的期望炸的次数为 nk

bitset第一次见..

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <bitset>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))

const int INF = ( 1 << 30 );

int n;
bitset <1005> g[1005];
int cnt[1005];
int main()
{
    int _,cas = 1,k,x;
    RD(_);
    while(_--){
        printf("Case #%d: ",cas++);
        RD(n);
        clr0(cnt);
        for(int i = 1;i <= n;++i)
            g[i].reset();
        for(int i = 1;i <= n;++i){
            g[i][i] = 1;
            RD(k);
            while(k--){
                RD(x);
                g[x][i] = 1;
            }
        }
        for(int i = 1;i <= n;++i){
            for(int j = 1;j <= n;++j){
                if(g[j][i]) g[j] |= g[i];
            }
        }
        double ans = 0.0;
        for(int i = 1;i <= n;++i){
            for(int j = 1;j <= n;++j){
                if(g[i][j]) cnt[i]++;
            }
            ans += 1.0/(double)cnt[i];
        }
        printf("%.5lf\n",ans);
    }
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值