水概率题,刚开始学ACM的时候根本没头绪,现在拿出来再看看,果断1A。
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 16
using namespace std;
char name[N][20];
double R[N][N];
struct node{
double rad[N];
}tree[2*32];
void Cal(int l,int r,int k){
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
tree[k].rad[i]+=tree[l].rad[i]*tree[r].rad[j]*R[i][j]/(double)1e4;
tree[k].rad[j]+=tree[l].rad[i]*tree[r].rad[j]*R[j][i]/(double)1e4;
}
return ;
}
int main(){
for(int i=0;i<N;i++)
scanf("%s",name[i]);
for(int i=0;i<N;i++)
for(int j=0;j<16;j++)
scanf("%lf",&R[i][j]);
memset(tree,0,sizeof(tree));
for(int i=N;i<2*N;i++)
tree[i].rad[i-N]=100;
for(int i=N;i>1;i/=2)
for(int j=i;j<2*i;j+=2)
Cal(j,j+1,j/2);
for(int i=0;i<N;i++){
printf("%s",name[i]);
for(int j=0;j<10-strlen(name[i]);j++)
printf(" ");
printf(" p=%.2lf%%\n",tree[1].rad[i]);
}
return 0;
}