poj3071--Football(概率计算)

题目链接:点击打开链接

题目大意:给出2^n个队伍,采用淘汰制比赛,第1和第2比赛,第2和第三比赛,淘汰之后,仍然按顺序比赛,p[i][j]:第i支队伍赢第j支队伍的概率,问最终哪个队伍赢的概率最大。

一共会比n场比赛,计算出每一个队伍赢得概率,找出最大值。

第一场 1对2,3对4,,,,

第二场1、2对3、4,5、6对7、8,,,,

第三场1、2、3、4对5、6、7、8,,

这样对于第i个队如果想要在第k场赢,那么他需要在第k-1场赢的概率乘以∑(j在k-1场赢的概率*i对上j赢概率)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std ;
#define eqs 1e-8
double p[200][200] ;
double ans[200][200] ;
int main() {
    int n , m ;
    int i , j , len , k , l , r , mid ;
    double temp ;
    while( scanf("%d", &n) && n != -1 ) {
        m = 1<<n ;
        for(i = 1 ; i <= m ; i++) ans[n][i] = 1.0 ;
        for(i = 1 ; i <= m ; i++)
            for(j = 1 ; j <= m ; j++)
                scanf("%lf", &p[i][j]) ;
        len = 2 ;
        while( n-- ) {
            k = 1 ;
            while( k*len <= m ) {
                l = 1+(k-1)*len ;
                r = k*len ;
                mid = (l+r) / 2 ;
                for(i = l ; i <= r ; i++) {
                    temp = 0.0 ;
                    if( i <= mid ) {
                        for(j = mid+1 ; j <= r ; j++)
                            temp += ans[n+1][j]*p[i][j] ;
                        ans[n][i] = ans[n+1][i]*temp ;
                    }
                    else {
                        for(j = l ; j <= mid ; j++)
                            temp += ans[n+1][j]*p[i][j] ;
                        ans[n][i] = ans[n+1][i]*temp ;
                    }
                }
                k++ ;
            }
            len *= 2 ;
        }
        temp = ans[0][1] ;
        k = 1 ;
        for(i = 2 ; i <= m ; i++) {
            if( ans[0][i]-temp >= eqs ) {
                temp = ans[0][i] ;
                k = i ;
            }
        }
        printf("%d\n", k) ;
    }
    return 0 ;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值