这两题基本是一样的,模拟球队之间对战、晋级,整个过程就是一颗满二叉树,最终根节点的位置就是冠军

这道题目有一个很神奇的地方,改天我会仔细解释,现在先留着代码

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 double p[130][130];
4 double dp[130][8];
5 int main(){
6 int i,j,t,cases=1;
7 char str[20][20];
8 scanf("%d",&t);
9 while(t--){
10 for(i=0;i<16;i++)
11 scanf("%s",str[i]);
12 for(i=0;i<16;i++){
13 for(j=0;j<16;j++){
14 scanf("%lf",&p[i][j]);
15 p[i][j]/=100.0;
16 }
17 dp[i][0]=1;
18 }
19 for(i=0;i<4;i++)
20 for(j=0;j<16;j++){
21 double sum=0;
22 for(int k=(1<<i);k<(1<<(i+1));k++)
23 sum+=dp[k^j][i]*p[j][k^j];
24 dp[j][i+1]=dp[j][i]*sum;
25 }
26 printf("Scenario #%d:\n",cases++);
27 for(i=0;i<16;i++){
28 printf("%-10s",str[i]);
29 printf("%7.2lf\n",dp[i][4]*100);
30 }if(t) puts("");
31 }
32 return 0;
33 }
34 /*
35 Germany 17.69
36 Sweden 3.45
37 Argentina 12.32
38 Mexico 2.65
39 Italy 7.04
40 Australia 1.81
41 Switzerl 2.43
42 Ukraine 3.46
43 England 7.75
44 Ecuador 1.83
45 Portugal 5.19
46 Holland 6.36
47 Brazil 12.20
48 Ghana 0.89
49 Spain 11.47
50 France 3.46
51 */

代码几乎一样

View Code
#include<stdio.h>
#include<string.h>
double p[130][130];
double dp[130][8];
int main()
{
int n,i,j;
while(scanf("%d",&n),n!=-1)
{
int m=(1<<n);
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
scanf("%lf",&p[i][j]);
}
dp[i][0]=1;
}
int win;
for(i=0;i<n;i++)
{
win=0;
for(j=0;j<m;j++)
{
double sum=0;
for(int k=(1<<i);k<(1<<(i+1));k++)
{
sum+=dp[k^j][i]*p[j][k^j];
}
dp[j][i+1]=dp[j][i]*sum;
if(dp[j][i+1]>dp[win][i+1]) win=j;
}
}
printf("%d\n",win+1);
}
return 0;
}



相关文章:

  • 2022-01-30
  • 2021-10-29
  • 2022-12-23
  • 2021-08-06
  • 2021-06-01
  • 2022-12-23
  • 2022-12-23
  • 2021-07-05
猜你喜欢
  • 2022-12-23
  • 2021-10-24
  • 2021-09-15
  • 2021-06-13
  • 2021-07-12
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案