您的位置:首页 > 编程语言 > C语言/C++

淘汰赛制(elimination.pas/c/cpp)

2011-09-23 21:26 471 查看
淘汰赛制(elimination.pas/c/cpp)

【问题描述】

淘汰赛制是一种极其残酷的比赛制度。2n名选手分别标号1,2,3,…,2n-1,2n,他们将要参加n轮的激烈角逐。每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第3位与第4位比赛,第5位与第6位比赛……只有每场比赛的胜者才有机会参加下一轮的比赛(不会有平局)。这样,每轮将淘汰一半的选手。n轮过后,只剩下一名选手,该选手即为最终的冠军。

现在已知每位选手分别与其他选手比赛获胜的概率,请你预测一下谁夺冠的概率最大。

【输入文件】

输入文件elimination.in。第一行是一个整数n(l≤n≤l0),表示总轮数。接下来2n行,每行2n个整数,第i行第j个是pij(0≤pij≤100,pii=0,pij+pji=100),表示第i号选手与第j号选手比赛获胜的概率。

【输出文件】

输出文件elimination.out。只有一个整数c,表示夺冠概率最大的选手编号(若有多位选手,输出编号最小者)。

【样例输入】

2

0 90 50 50

10 0 10 10

50 90 0 50

50 90 50 0

【样例输出】

1

【数据规模】

30%的数据满足n≤3;100%的数据满足n≤10。

====================================

====================================

var
map:array[1..1024,1..1024]of double;
f:array[1..1024,1..11]of double;
n:longint;
procedure init;
begin
assign(input,'elimination.in');
assign(output,'elimination.out');
reset(input); rewrite(output);
end;

procedure terminate;
begin
close(input); close(output);
halt;
end;

procedure dfs(l,r,c:longint);
var
i,j:longint;
mid:longint;
t1,t2:double;
begin
if l=r then exit;
mid:=(l+r) shr 1;
dfs(l,mid,c+1);
dfs(mid+1,r,c+1);

for i:=l to mid do
begin
for j:=mid+1 to r do
begin
t1:=f[i,c+1]*f[j,c+1]*map[i,j];
t2:=f[i,c+1]*f[j,c+1]*map[j,i];
f[i,c]:=f[i,c]+t1;
f[j,c]:=f[j,c]+t2;
end;
end;
end;

procedure main;
var
i,j,np:longint;
max_v:double;
max_n:longint;
begin
readln(np);
n:=1 shl np;
// for i:=
for i:=1 to n do
for j:=1 to n do
begin
read(map[i,j]);
map[i,j]:=map[i,j]/100;
end;
fillchar(f,sizeof(f),0);
for i:=1 to n do f[i,np+1]:=1;

dfs(1,n,1);
max_v:=0;
for i:=1 to n do
begin
if max_v<f[i,1] then
begin
max_v:=f[i,1];
max_n:=i;
end;
end;
writeln(max_n);

end;

begin
init;
main;
terminate;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: