#include<stdio.h> #include<math.h> #include<vector> using namespace std; const int MAX=100010; int DEPest=0; int root=-1,N; double P,r,sum=0; vector<int> child[MAX]; //child[父亲][孩子] 二维数组表示树形结构 double price[MAX]; //记录叶子节点的权值 void DFS(int root,int depth) { if(child[root].size()==0) //叶子节点开始判断深度 { double p=pow(1+r,1.0*depth)*P; //【skill】转化为double型,乘以1.0 /*for(int i=0 ; i<depth ; ++i) p*=(1+r); */ sum+=p*price[root]; //总价加上数量乘以单价 return; } for(int i=0 ; i<child[root].size() ; ++i) DFS(child[root][i],depth+1); } int main() { scanf("%d%lf%lf",&N,&P,&r); r/=100; //换算成百分数 for(int i=0 ; i<N ; ++i) { int father,tmp; scanf("%d",&father); if(father!=0) { for(int j=0 ; j<father ; ++j) { scanf("%d",&tmp); child[i].push_back(tmp); } } else { scanf("%lf",&price[i]); //叶子节点权值 } } DFS(0,0); printf("%.1f",sum); return 0; }
时间: 2024-12-08 09:43:29