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

本文介绍了一种通过计算每位选手与其他选手比赛获胜概率的方法来预测淘汰赛中最有潜力成为冠军的选手。通过逐轮更新选手的胜利概率,最终确定夺冠概率最大的选手。

【问题描述】
淘汰赛制是一种极其残酷的比赛制度。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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值