题目链接
题意:
有
2
n
2^n
2n只球队进行比赛,比赛方式是
第一轮:1和2,3和4…,
2
n
2^n
2n-1和
2
n
2^n
2n
第二轮:winner(1,2)和winner(3,4)…
.
.
.
显然这样的比赛会进行
n
n
n轮,给出每只队伍面对其他队伍的胜率,求最后谁的冠军最有可能是谁
题解:
如果把球队编号设为0~ 2 n 2^n 2n-1的话,设 k k k为两只球队x,y二进制不同最高位,即 x & ( 1 < < k ) ! = y & ( 1 < < k ) x\&(1<<k)!=y\&(1<<k) x&(1<<k)!=y&(1<<k),则x,y只可能在第k轮相遇,设 f ( i , k ) f(i,k) f(i,k)为队伍 i i i 在 第 k k k 轮获胜的概率,则 f ( i , k ) = r a t e ( i , j ) ∗ f ( i , k − 1 ) ∗ f ( j , k − 1 ) ( k ∈ [ i + 1 , 2 n − 1 ] ) f(i,k)=rate(i,j)*f(i,k-1)*f(j,k-1)\ \ \ (k\in[i+1,2^n-1]) f(i,k)=rate(i,j)∗f(i,k−1)∗f(j,k−1) (k∈[i+1,2n−1])
#include<iostream>
#include<sstream>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include <utility>
#include<algorithm>
#include<cstdio>
#include<list>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<time.h>
using namespace std;
#define int long long
#define PI acos(-1.0)
#define eps 1e-9
#define lowbit(a) ((a)&-(a))
const int mod = 1e9+7;
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int n;
const int INF = 0x3f3f3f3f;
const int N = 1e6+10;
double rate[1000][1000],f[1000][10];
int solve(int x,int y){
for(int i=10;i>=0;i--)
if((y&(1<<i))!=(x&(1<<i)))
return i;
}
#define endl '\n'
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
while(cin>>n&&n!=-1){
memset(f,0,sizeof f);
int m=(1<<n);
for(int i=0;i<m;i++)for(int j=0;j<m;j++)cin>>rate[i][j];
for(int i=0;i<m;i++)f[i][0]=1.0;
for(int k=0;k<n;k++){
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
int res=solve(i,j);
if(res!=k)continue;
f[i][k+1]+=rate[i][j]*f[i][k]*f[j][k];
f[j][k+1]+=rate[j][i]*f[i][k]*f[j][k];
}
}
}
double ans=0; int p;
for(int i=0;i<m;i++)
if(f[i][n]>ans)ans=f[i][n],p=i;
cout<<p+1<<endl;
}
}