POJ 3071: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的更多相关文章
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 【POJ 3071】 Football
[题目链接] http://poj.org/problem?id=3071 [算法] 概率DP f[i][j]表示第j支队伍进入第i轮的概率,转移比较显然 [代码] #include <algo ...
- POJ 2315:Football Game(博弈论)
[题目链接] http://poj.org/problem?id=2315 [题目大意] 两名球员轮流从N个球中挑出不多于M个射门,每个球半径都是R,离球门S. 每次只能踢出L以内的距离.进最后一个球 ...
- 【POJ】【3071】Football
概率DP kuangbin总结中的第10题 简单的画个比赛图,会发现是一颗完全二叉树,且同一层的子树之间各自独立,只有在合并得到更高一层结果时才结合. 所以我们可以按比赛轮数进行DP,f[i][j]表 ...
- 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 ...
- POJ 3252:Round Numbers
POJ 3252:Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10099 Accepted: 36 ...
- POJ 3071 Football:概率dp
题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两 ...
- poj 3071 Football(概率dp)
id=3071">http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率 ...
- POJ 3071 Football 【概率DP】
Football Football Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3734 Accepted: 1908 ...
随机推荐
- android 动态壁纸开发
转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发参考:http://www.ophonesdn.com/article ...
- mabatis--动态sql
1.mybatis核心,对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装: 2.使用if判断: <where> <if test="customer ...
- 「NOIP2010」引水入城
传送门 Luogu 解题思路 第一问很好做,只要总第一行的每一个点都跑一边dfs,判断最后一行是否有点标记不了即可. 考虑处理第二问. 其实这一问就是: 把第一行的点都看做是对最后一行一些点的覆盖,求 ...
- 086、Java数组之对象数组的动态初始化
01.代码如下: package TIANPAN; class Book { private String title; private double price; public Book(Strin ...
- IntelliJ如何设置自动导包
idea 关于自动导包的设置 标签: idea 2016-09-30 18:10 400人阅读 评论(0) 收藏 举报 本文章已收录于: .embody{ padding:10px 10px 10px ...
- 前端学习笔记系列一:11@vue/cli3.x中实现跨域的问题
由于浏览器的同源访问策略,vue开发时前端服务器通常与后端api服务器并非是相同的服务器,因此需要使用一个代理服务器实现跨域访问.在@vue/cli3.x根目录下创建一个vue.config.js文件 ...
- 严重: Exception loading sessions from persistent storage
2011-11-24 10:05:00| 分类: java学习|举报|字号 订阅 当tomcat启动的时候出现下面错误: [ERROR] org.apache.catalina.sessio ...
- Python中的*可变参数与**关键字参数
1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...
- XV6源代码阅读-虚拟内存管理
Exercise1 源代码阅读 1.内存管理部分: kalloc.c vm.c 以及相关其他文件代码 kalloc.c:char * kalloc(void)负责在需要的时候为用户空间.内核栈.页表页 ...
- python 文本文件操作
文件操作三步走:打开.读写.关闭. open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, close ...