栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3493 Palm Up and Palm Down

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3493 Palm Up and Palm Down

#include<iostream>#include<cstring>#include<map>#include<algorithm>#include<stack>#include<queue>#include<cmath>#include<string>#include<cstdlib>#include<vector>#include<cstdio>#include<set>#include<list>#include<numeric>#include<cassert>#include<ctime>#include<bitset>using namespace std;const double EPS = 1e-8;double dp[1<<13], u[13], d[13], r[13], p[13], s[13];double up[1<<13], down[1<<13];double lose[13][13];int bitcount[1<<13];string name[13];int main(){ for (int mask = 0; mask < (1<<13); mask ++) { bitcount[mask] = bitcount[mask>>1] + (mask&1); } int T,n; for (scanf("%d", &T); T--; ) { scanf("%d", &n); for (int i = 0; i < n; i ++) { cin>>name[i]; cin>>u[i]>>d[i]; double sum = u[i] + d[i]; u[i] /= sum; d[i] /= sum; cin>>r[i]>>p[i]>>s[i]; sum = r[i]+p[i]+s[i]; r[i] /= sum; p[i] /= sum; s[i] /= sum; } up[0] = down[0] = 1.0; for(int mask = 1; mask < (1<<n); mask ++) { int x; for(int i = 0; i < n ; i ++) { if(mask & (1<<i)){ x = i; break; } } up[mask] = up[mask^(1<<x)]*u[x]; down[mask] = down[mask^(1<<x)]*d[x]; } for(int x = 0; x < n; x++){ for(int y = 0; y < n ; y++) { lose[x][y] = r[x]*p[y] + p[x]*s[y] + s[x]*r[y]; } } for ( int mask = 1; mask < (1<<n) ; mask ++) { if(bitcount[mask] == 1) { dp[mask] = 0.0; }else if(bitcount[mask] == 2){ int x = -1, y; for(int i = 0; i < n ; i ++) { if(mask & (1<<i)){ x == -1 ? x = i : y = i; } } dp[mask] = 1.0 / (lose[x][y]+lose[y][x]); }else { double div = 0, mul = 1.0; for(int sub = mask & (mask - 1) ; sub > 0 ; sub = mask & (sub - 1)) { int other = mask ^ sub;  if(bitcount[sub] != bitcount[other] && up[sub] > 0 && down[other] > 0){ div += up[sub]*down[other]; mul += up[sub]*down[other]*dp[bitcount[sub] < bitcount[other] ? sub : other]; } } dp[mask] = mul / div; } }  if(dp[(1<<n) - 1] > 1e30) { printf("Infinity "); }else{ printf("%.3f ", dp[(1<<n) - 1] ); } double ans = 0; fill(dp, dp+(1<<n), 0); dp[(1<<n) -1] = 1.0; for (int mask = (1<<n) - 1; mask > 0 ; mask -- ) { if(dp[mask] == 0){ continue; } if(bitcount[mask] == 1){ ans = max(ans, dp[mask]); }else if(bitcount[mask] == 2){ int x = -1, y; for(int i = 0; i < n ; i ++) { if(mask & (1<<i)){ x == -1 ? x = i : y = i; } } if(lose[x][y] + lose[y][x] > 0) { dp[1<<x] += lose[x][y] / (lose[x][y] + lose[y][x]) * dp[mask]; dp[1<<y] += lose[y][x] / (lose[x][y] + lose[y][x]) * dp[mask]; } }else{ double div = 0; for(int sub = mask & (mask - 1) ; sub > 0 ; sub = mask & (sub - 1) ) { int other = mask ^ sub; if(bitcount[sub] != bitcount[other] && up[sub] > 0 && down[other] > 0) { div += up[sub]*down[other]; } } if(div == 0){ continue; } for(int sub = mask & (mask - 1) ; sub > 0 ; sub = mask & (sub - 1) ) { int other = mask ^ sub; if(bitcount[sub] != bitcount[other] && up[sub] > 0 && down[other] > 0) { dp[bitcount[sub] < bitcount[other] ? sub : other] += up[sub]*down[other]/div*dp[mask]; } } } } vector<string> vt; for(int i = 0 ; i < n ; i ++ ) { if(fabs(dp[1<<i] - ans ) < EPS) { vt.push_back(name[i]); } } sort(vt.begin(), vt.end()); printf("%.3f%%n", ans*100); for(vector<string>::iterator it = vt.begin() ; it != vt.end() ; it++) { if(it != vt.begin()) { putchar(' '); } cout<<*it; } cout<<endl; } return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379109.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号