您的位置:首页 > 其它

HDU 5036 Explosion

2017-09-11 21:31 323 查看
考虑爆破顺序为一个序列,
对于第i扇门,有x扇门的爆破能够直接或间接打开第i扇门,
那么第i扇门被爆破,当且仅当序列中i排在这x个数的最前面,
因此第i扇门的爆破期望值是1/x,
然后每一扇门的期望都是独立的,
那么把所有1/x加起来就是答案...
那么具体实现需要统计每一个xi,
那么可以先强连通缩点得到一个DAG,
然后bitset暴力搞一下,
时间复杂度大约n^3/64...

#include <cstdio>
#include <bitset>
#include <algorithm>
#include <iostream>

using namespace std;

const int MAX = 1010;

int T,k,N,num;
bitset<MAX> key[MAX];

int main(void)
{
//freopen("input.txt","r",stdin);
int cas = 1;
scanf("%d", &T);
while(T--){
scanf("%d", &N);
for(int i = 0; i < N; ++i){
key[i].reset();
key[i][i] = true;
}
for(int i = 0; i < N; ++i){
scanf("%d", &k);
for(int j = 0; j < k; ++j){
scanf("%d", &num);
key[i][num-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.0;
for(int j = 0; j < N; ++j){
int cnt = 0;
for(int i = 0; i < N; ++i)
if(key[i][j]) cnt++;
ans += 1.0 / cnt;
//printf("%f\n",ans);
}

printf("Case #%d: %.5f\n",cas++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: