记录编号 |
77796 |
评测结果 |
AAAAAAAAAA |
题目名称 |
网球赛 |
最终得分 |
100 |
用户昵称 |
digital-T |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.336 s |
提交时间 |
2013-11-02 18:03:37 |
内存使用 |
8.86 MiB |
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fi("elimination.in");
ofstream fo("elimination.out");
double p[1050][1050],win[1050][11];
int N,Num,group[1050][11];
int main()
{
fi>>N;
Num=1<<N;
for(int i=0;i<Num;i++)
for(int j=0;j<Num;j++)
{
fi>>p[i][j];
p[i][j]/=100.0;
}
for(int i=0;i<Num;i++)win[i][0]=1,group[i][0]=i;
for(int i=1;i<=N;i++)
{
int tmp=1<<i,team=0;
for(int j=0;j<Num;j++)
{
group[j][i]=team;//记录每一组的编号
if((j+1)%tmp==0)team++;
//fo<<group[j][i]<<' ';
}
//fo<<endl;
}
for(int i=1;i<=N;i++)//Round
{
int tmp=1<<(i-1);
for(int j=0;j<Num;j++)
{
double possibility=0;
int k=group[j][i-1]^1;
int l=k*tmp;
for(;l<Num && group[l][i-1]==k;l++)
possibility+=win[l][i-1]*p[j][l];
win[j][i]=win[j][i-1]*possibility;
}
}
int ans=0;
for(int i=1;i<Num;i++)
if(win[i][N]>win[ans][N])ans=i;
fo<<(ans+1)<<endl;
return 0;
}