还行这个题,看到就有思路的题,建树求层数然后再加权值。
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
vector<int>child;
int layer;
}tree[500010];
int retail[500010];
int bfs(int root){
queue<int>q;
tree[root].layer=0;
q.push(root);
while(q.size()!=0){
int step=q.front();
q.pop();
for(int i=0;i<tree[step].child.size();i++){
tree[tree[step].child[i]].layer=tree[step].layer+1;
q.push(tree[step].child[i]);
}
}
}
int main(){
int n;
double p,r;
int num0=0;
scanf("%d %lf %lf",&n,&p,&r);
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
if(temp==0){
scanf("%d",&tree[i].data);
retail[num0++]=i;
}
else{
for(int j=0;j<temp;j++){
int temp0;
scanf("%d",&temp0);
tree[i].child.push_back(temp0);
}
}
}
bfs(0);
double sum=0;
for(int i=0;i<num0;i++){
sum+=(double)tree[retail[i]].data*pow(1+0.01*r,(double)tree[retail[i]].layer)*p;
}
printf("%.1f",sum);
}