Football
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 3600   Accepted: 1844

Description

Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. In each round of the tournament, all teams still in the tournament are placed in a list in order of increasing index. Then,
the first team in the list plays the second team, the third team plays the fourth team, etc. The winners of these matches advance to the next round, and the losers are eliminated. After n rounds, only one team remains undefeated; this team is declared
the winner.

Given a matrix P = [pij] such that pij is the probability that team i will beat team j in a match determine which team is most likely to win the tournament.

Input

The input test file will contain multiple test cases. Each test case will begin with a single line containing n (1 ≤ n ≤ 7). The next 2n lines each contain 2n values; here, the jth value
on the ith line represents pij. The matrix P will satisfy the constraints that pij = 1.0 − pji for all i ≠ j, and pii = 0.0 for all i.
The end-of-file is denoted by a single line containing the number −1. Note that each of the matrix entries in this problem is given as a floating-point value. To avoid precision problems, make sure that you use either the double data type instead
of float.

Output

The output file should contain a single line for each test case indicating the number of the team most likely to win. To prevent floating-point precision issues, it is guaranteed that the difference in win probability for the top two teams will be at least
0.01.

Sample Input

2
0.0 0.1 0.2 0.3
0.9 0.0 0.4 0.5
0.8 0.6 0.0 0.6
0.7 0.5 0.4 0.0
-1

Sample Output

2

Hint

In the test case above, teams 1 and 2 and teams 3 and 4 play against each other in the first round; the winners of each match then play to determine the winner of the tournament. The probability that team 2 wins the tournament in this case is:

P(2 wins)  P(2 beats 1)P(3 beats 4)P(2 beats 3) + P(2 beats 1)P(4 beats 3)P(2 beats 4)

p21p34p23 + p21p43p24

= 0.9 · 0.6 · 0.4 + 0.9 · 0.4 · 0.5 = 0.396.

The next most likely team to win is team 3, with a 0.372 probability of winning the tournament.

题意很明显,给出几支球队,给出他们相互之间胜负关系的概率,比赛机制就是两两对战淘汰,公式也在Hint中给出了。

所以问题就在  第几轮对战的双方的规律。我自己找出的规律就是 从0开始标记各支战队,第m支战队第n轮会碰到的对手是 将m化为二进制,从右往左开始算 第n位会不同,第n+1位开始要相同,其余位任意的所有数。

比方说:第3轮 第15支战队会碰到的对手是什么呢?

将15变为二进制是1111。第三轮,从右至左的第三位原来是1,现在变为0。

就是10XX,所以第15支战队第三轮会碰到的对手就是1000,1001,1010,1011这四支队。

这样的话,就按照Hint中给的思路求各支战队获得冠军的概率,比较谁最大输出即可。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std; double value[1<<9][1<<9];
double dp[10][1<<9]; int main()
{
//freopen("input.txt","r",stdin);
//freopen("out.txt","w",stdout);
int N,i,j,m;
while(cin>>N)
{
if(N == -1)
break; memset(value,0,sizeof(value));
memset(dp,0,sizeof(dp)); for(i=0;i<(1<<N);i++)
{
for(j=0;j<(1<<N);j++)
{
cin>>value[i][j];
}
} for(i=0;i<(1<<N);i++)
{
dp[0][i]=1;
} for(i=1;i<=N;i++)
{
for(j=0;j<(1<<N);j++)
{
int temp=j;
int pend= (temp>>(i-1))&1;
int temp2=(temp>>(i))<<i;
if(!pend)
{
temp2=temp2+(1<<(i-1));
} int k;
for(k=0;k<(1<<(i-1));k++)
{
if(j!=temp2)
{
dp[i][j] += dp[i-1][j]*dp[i-1][temp2]*value[j][temp2];
}
temp2++;
}
}
}
double max=0;
int max_v=-1;
for(i=0;i<(1<<N);i++)
{
if(dp[N][i]>=max)
{
max=dp[N][i];
max_v=i+1;
}
}
cout<<max_v<<endl;
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 3071:Football的更多相关文章

  1. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  2. 【POJ 3071】 Football

    [题目链接] http://poj.org/problem?id=3071 [算法] 概率DP f[i][j]表示第j支队伍进入第i轮的概率,转移比较显然 [代码] #include <algo ...

  3. POJ 2315:Football Game(博弈论)

    [题目链接] http://poj.org/problem?id=2315 [题目大意] 两名球员轮流从N个球中挑出不多于M个射门,每个球半径都是R,离球门S. 每次只能踢出L以内的距离.进最后一个球 ...

  4. 【POJ】【3071】Football

    概率DP kuangbin总结中的第10题 简单的画个比赛图,会发现是一颗完全二叉树,且同一层的子树之间各自独立,只有在合并得到更高一层结果时才结合. 所以我们可以按比赛轮数进行DP,f[i][j]表 ...

  5. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

  6. POJ 3252:Round Numbers

    POJ 3252:Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10099 Accepted: 36 ...

  7. POJ 3071 Football:概率dp

    题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两 ...

  8. poj 3071 Football(概率dp)

    id=3071">http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率 ...

  9. POJ 3071 Football 【概率DP】

    Football Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3734   Accepted: 1908 ...

随机推荐

  1. L1和L2范数理解

    参考:https://www.jianshu.com/p/4bad38fe07e6

  2. 关于C/C++的各种优化

    一.常量 声明常量可以方便代码的修改,提高复用性. ; +; ; 同时,声明常量也可以减少重复运算,提高代码速度,例子如下: string s; cin>>s; ;i<len;i++ ...

  3. php 键值数组搜索查询

    php  键值数组查询 ,需要先将其转换为纯数组,然后才能用in_array 进行搜索. $arr_combos = [ ['id' => '1001', 'value' => 'zs' ...

  4. 了解AOP以及实现方式

    AOP是什么? 面向切面编程,把那些与业务无关,却为业务模块所共同调用的逻辑封装成一个可重的模块,即切面 使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点.业 ...

  5. jmeter断言之响应code:200

    因为Jmeter只要检测到网页的响应,就认为是Pass而并不管当前网页内容的正确性.在进行压力测试时,为了检查Web服务器返回的网页是否正确,我们可以设置断言,这些断言是验证网页上是否存在指定的Tex ...

  6. 怎样快速高效的定义Django的序列化器

    1.使用Serializer方法自己创建一个序列化器 先写一个简单的例子 class BookInfoSerializer(serializers.Serializer): ""& ...

  7. HiBench成长笔记——(3) HiBench测试Spark

    很多内容之前的博客已经提过,这里不再赘述,详细内容参照本系列前面的博客:https://www.cnblogs.com/ratels/p/10970905.html 创建并修改配置文件conf/spa ...

  8. Linux-Journal

    Linux-Journal 1. 日志简介 2. 日志的优先级和分类 2.1 优先级 2.2 设施分类 3. 命令帮助 4. 日志查看示例 5. 日志大小限制 6. 手动清理日志文件 1. 日志简介 ...

  9. docker安装并设置开机启动(Linux)

    docker 开机启动: systemctl enable docker 使用的linux系统为CentOS7.2 docker分为CE和EE版本,EE版本收费,一般我们使用CE版本就满足要求了 do ...

  10. python手动实现深拷贝

    深拷贝是将对象全拷贝,包括嵌套对象 def deepcopy(cls): if isinstance(cls, dict): dct = {} for k, v in cls.items(): dct ...