您的位置:首页 > 其它

CODE[VS] 1652 淘汰赛制 签到暴力

2016-07-01 15:46 267 查看
【问题描述】

淘汰赛制是一种极其残酷的比赛制度。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 9050 50

100 10 10

5090 0 50

5090 50 0

【样例输出】

1

【数据规模】

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

虽然题目在CV上面是钻石难度但是只要暴力把每一个人的概率算出来就可以AC,我是枚举每一次比赛,更新每一个人的(到这场比赛然后)胜利的概率。

贴代码

var

max:real;

n,i,m,j,q,p,ans:longint;

a:array[0..1025,0..1025]of real;

b,d:array[0..1025]of real;

procedure bl(a1:longint);

var i,p,qq,mid,j,k:longint;

c:real;

begin

for i:=1 to a1 do begin

p:=i*q;

qq:=(i-1)*q+1;

mid:=(p+qq-1) div 2;

j:=qq;

repeat

c:=0;

for k:=mid+1 to p do c:=c+a[j,k]*b[k];

d[j]:=b[j]*c;

inc(j);

until j>mid;

p:=i*q;

qq:=(i-1)*q+1;

mid:=(p+qq-1) div 2;

j:=mid+1;

repeat

c:=0;

for k:=qq to mid do c:=c+a[j,k]*b[k];

d[j]:=b[j]*c;

inc(j);

until j>p

end;

for i:=1 to m do b[i]:=d[i];

end;

begin

read(n);

m:=1;

for i:=1 to n do m:=m*2;

for i:=1 to m do

for j:=1 to m do begin

read(a[i,j]);

a[i,j]:=a[i,j]/100;

end;

for i:=1 to m div 2 do b[i*2-1]:=a[i*2-1,i*2];

for i:=1 to m div 2 do b[i*2]:=a[i*2,i*2-1];

q:=2;

for i:=2 to n do begin

q:=q*2;

bl(m div q);

end;

for i:=1 to m do if b[i]>max then begin

max:=b[i];

ans:=i;

end;

writeln(ans);

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