原文:我的個人博客
原題鏈接
1079 Total Sales of Supply Chain
考點
樹的深度優先遍歷
思路
給一棵樹,在樹根出貨物的價格爲p,然後從根結點開始每往下走一層,該層的貨物價格將會在父親結點的價格上增加r%,給出每個葉結點的貨物量,求他們的價格之和。
抽象爲樹的題目,給你每個節點的孩子節點。如果是葉子節點(零售商),就給你它的權重(商品數量),需要讓你求所有零售商賣出的商品總價格。因此需要記錄每個零售商的深度,也就是計算商品上漲了幾次r%。
代碼
#include <bits/stdc++.h>
using namespace std;
vector<int>tree[100010],leaf;
map<int,int>num;
map<int,int>height;//記錄每個節點的高度
void dfs(int root,int depth){
height[root]=depth;
for(int i=0;i<tree[root].size();i++){
dfs(tree[root][i],depth+1);
}
}
int main(){
int n,k,tmp;
double p,r;
cin>>n>>p>>r;
for(int i=0;i<n;i++){
cin>>k;
if(k!=0){//非葉子節點
for(int j=0;j<k;j++){
cin>>tmp;
tree[i].push_back(tmp);
}
}else{
cin>>tmp;
num[i]=tmp;//記錄零售商的商品總數
leaf.push_back(i);
}
}
dfs(0,0);
double ans=0.0;
for(int i=0;i<leaf.size();i++){
ans += num[leaf[i]]*p*pow(1+r/100,height[leaf[i]]);
}
printf("%.1f",ans);
}