思路
1) 题目的关键点在于找出每个叶子节点的层次,可以通过层序遍历来实现。
2)层序遍历可以通过队列的方式实现,同时在遍历的同时,对每个节点的层次进行标记
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
const int maxen = 100010;
using namespace std;
struct node
{
int data = 0;
int layer;
vector<int> child;
}Node[maxen];
void Layerorder(int root);
int main()
{
int n,num;
double price,rate;
scanf("%d%lf%lf",&n,&price,&rate);
for(int i=0;i<n;i++)
{
scanf("%d",&num);
if(num==0)
{
scanf("%d",&Node[i].data);
}
for(int j=0;j<num;j++)
{
int temp;
scanf("%d",&temp);
Node[i].child.push_back(temp);
}
}
Layerorder(0);
double ans;
for(int i=0;i<n;i++)
{
if(Node[i].data!=0)
{
ans += price* Node[i].data*pow((1+0.01*rate),Node[i].layer);
}
}
printf("%.1f",ans);
return 0;
}
void Layerorder(int root)
{
queue<int> q;
q.push(root);
Node[root].layer=0;
while(!q.empty())
{
int front = q.front();
q.pop();
for(int i=0;i<Node[front].child.size();i++)
{
int child = Node[front].child[i];
Node[child].layer = Node[front].layer+1;
q.push(child);
}
}
}