淘汰赛制
2015-10-17 16:26
369 查看
【问题描述】
淘汰赛制是一种极其残酷的比赛制度。2n名选手分别标号1,2,3,……2n-1,2n,他们将要参加n轮的激烈角逐。每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第3位与第4位比赛,第5位与第6位比赛……只有每场比赛的胜者才有机会参加下一轮的比赛(不会有平局)。这样,每轮将淘汰一半的选手。n轮过后,只剩下一名选手,该选手即为最终的冠军。 现在已知每位选手分别与其他选手比赛获胜的概率,请你预测一下谁夺冠的概率最大。【输入文件】
输入文件elimination.in。第一行是一个整数n(1<=n<=10),表示总轮数。接下来2n行,每行2n个整数,第i行第j个是pij(0<=pij<=100,pii=0,pij+pji=100),表示第i号选手与第j号选手比赛获胜的概率。 【输出文件】
【样例输入】
2
0 90 50 50
10 0 10 10
50 90 0 50
50 90 50 0
【样例输出】
1
【数据规模】 30%的数据满足n<=3 100%的数据满足n<=10
分析
这道题看着貌似很经典的样子》》》。。。可DP,可分治。。下面主要说一下分治。
首先要明确该概率的算法:
f[i,j]表示第j位选手通过第i轮的概率,
> f[i,j]=f[i-1,j] * sum{f[i-1,k] * p[j,k]}
(i=1..n , j=1..2^n,k为所有可能在第i轮与第j位选手交战的选手编号)。。。其实这是DP的方程
时间复杂度O(n^2*2^n)。下面结合代码讲解具体的分治。
因为每场都是相邻的人进行比赛,所以保证了此算法的正确性,以人数为区间进行分治
每一场比赛都是人数减少一半,也就是分治时的二分区间长度
对于每个人在每轮比赛中所有可能遇到的对手:
由上面这个图可知对于每一场比赛中的、每一个人的所有可能对手,是在此场比赛时、把人数区间二分后的、另一半区间内所有人(即此人不在的另一半区间)
代码+注释
var p:array[1..1024,1..1024]of extended; f:array[0..10,1..1024]of extended; ans,n,nn,i,j:longint; procedure dfs(s,t,k:longint); var i,j,m:longint; begin if k=0 then exit; //将区间不断二分,k为第k轮比赛 m:=(s+t) shr 1; dfs(s,m,k-1); dfs(m+1,t,k-1); for i:=s to m do // 根据方程算概率 for j:=m+1 to t do begin f[k,i]:=f[k,i]+f[k-1,i]*f[k-1,j]*p[i,j]; //对于第i个人,此场比赛中所有可能对手就是另一半区间(m+1,t)内所有人 f[k,j]:=f[k,j]+f[k-1,j]*f[k-1,i]*p[j,i]; //对于第j个人,此场比赛中所有可能对手就是另一半区间(s,m)内所有人 end; end; begin readln(nn); //nn为总轮数,n为总人数 n:=1 shl nn; for i:=1 to n do for j:=1 to n do begin read(p[i,j]); p[i,j]:=p[i,j]/100; end; for i:=1 to n do f[0,i]:=1; //不要忘记赋初值 dfs(1,n,nn); ans:=1; for i:=2 to n do if f[nn,i]>f[nn,ans] then ans:=i; write(ans); end. 评测结果 Result 测试点 #1:通过该测试点。 得分10,耗时0ms,内存3141kB。 测试点 #2:通过该测试点。 得分10,耗时0ms,内存3125kB。 测试点 #3:通过该测试点。 得分10,耗时0ms,内存3162kB。 测试点 #4:通过该测试点。 得分10,耗时0ms,内存3198kB。 测试点 #5:通过该测试点。 得分10,耗时0ms,内存3284kB。 测试点 #6:通过该测试点。 得分10,耗时31ms,内存3411kB。 测试点 #7:通过该测试点。 得分10,耗时15ms,内存3690kB。 测试点 #8:通过该测试点。 得分10,耗时15ms,内存4763kB。 测试点 #9:通过该测试点。 得分10,耗时46ms,内存7409kB。 测试点 #10:通过该测试点。 得分10,耗时187ms,内存13746kB。
立冬。
小雪。
大雪。
冬至。
小寒。
大寒。
在无法遇见第二个寂寞的人的寂寞冬天——
独自行走、独自唱歌、独自逛街、独自看着
一整个世界狂欢。
相关文章推荐
- 对分治算法的几点思考
- 关于“2”这个数字
- hdu 1007 -- Quoit Design
- [Leetcode题解]004 Median of Two Sorted Arrays
- 分治法求最大连续和
- [BZOJ1492][NOI2007][斜率优化][动态凸包][DP][分治]货币兑换cash
- mergeSort
- HDU5269 ZYB loves Xor I(分治?解法)
- 算法时间复杂度----分治与递归
- 分治法--归并排序
- 最邻近点问题----分治法
- 分治法Devide-and 4000 -Conquer
- 偷懒的小X(lazy)
- FFT 快速傅里叶变换 初探
- [PKU1655]Balancing Act
- HOJ 13348 Finding Lines 画直线最多点
- 算法小白总结(三)-----分治法&&棋盘覆盖问题
- 算法小白总结(四)-----分治法之排序问题
- poj 1007
- 五大常用算法之一:分治算法