http://poj.org/problem?id=3071
题意:有2^n个队伍,给出每两个队伍之间的胜率,进行每轮淘汰数为队伍数/2的淘汰赛(每次比赛都是相邻两个队伍进行),问哪只队伍成为冠军概率最大。
很基础。
代码
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=1; 9 const double eps=1e-8; 10 const int modn=998244353; 11 int n; 12 double a[1<<8][1<<8]={}; 13 double f[1<<8][10]={}; 14 int main(){ 15 while(scanf("%d",&n)){ 16 if(n==-1)return 0; 17 memset(f,0,sizeof(f));memset(a,0,sizeof(a)); 18 int z=1<<n; 19 for(int i=1;i<=z;i++){ 20 for(int j=1;j<=z;j++){ 21 scanf("%lf",&a[i][j]); 22 } 23 } 24 for(int i=1;i<=z;i++){f[i][0]=1;} 25 for(int i=1;i<=n;i++){ 26 for(int j=1;j<=z;j++){ 27 int t=(j-1)/(1<<i); 28 t=t*(1<<i); t+=(1<<(i-1))+1; 29 if(t<=j)t=t-(1<<(i-1)); 30 int en=t+(1<<(i-1))-1; 31 for(int w=t;w<=en;w++){ 32 f[j][i]+=a[j][w]*f[w][i-1]*f[j][i-1]; 33 } 34 } 35 }double ans=0.0;int id=0; 36 for(int i=1;i<=z;i++){ 37 if(f[i][n]>ans){ 38 ans=f[i][n]; 39 id=i; 40 } 41 }printf("%d ",id); 42 } 43 return 0; 44 }