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...
对于第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; }
相关文章推荐
- Hdu 5036-Explosion 传递闭包,bitset,期望/概率
- HDU - 5036 Explosion
- HDU 5036 explosion
- HDU - 5036 Explosion(期望+bitset)【存疑】
- HDU 5036 Explosion(北京网络赛E题)
- hdu 5036 Explosion (期望+传递闭包)
- HDU - 5036 Explosion
- hdu_5036_Explosion(bitset优化传递闭包)
- hdu 5036 Explosion 2014 ACM/ICPC Asia Regional Beijing Online
- HDU 5036 Explosion
- hdu 5036 Explosion(bitset处理概率)
- HDU 5036 Explosion 2014 北京网络赛E题
- HDU 5036 Explosion 概率 期望
- hdu 5036 Explosion
- HDU 5036 Explosion (2014年北京赛区网络赛E题)
- hdu 5036 Explosion(有向图的删点期望+bitset优化)
- HDU 5036 Explosion 概率 期望
- hdu 5036 Explosion(概率期望+bitset)
- 【传递闭包】 HDOJ 5036 Explosion
- HDU - 5036 Operation the Sequence