题目大意:
给出一颗销售供应树,根结点为0,在树根处售价为P,然后从根节点开始,每一层的货物的价格就会在上一层的价格上增加r%,给出每个叶结点的货物量,要求计算所有叶结点的销售总额。
算法思路:
此题本质上考察的是树的遍历,该树是由供应商作为根节点,经销商作为子节点,零售商作为叶子节点组成。想要求叶子节点的销售总额,只需要求出叶子节点的售价,为此,我们只需要从根节点遍历该树,计算所有节点的售价,这样在遍历到叶子节点的时候就可以直接累计总售价。使用先序遍历或者层序遍历都是可以的,这里采用了先序遍历的方法,代码如下所示:
double total_sales = 0 ;// 总售价
void preTraverse(int root,double r){
if(node[root].child.empty()){
// 零售商,计算总售价
total_sales += node[root].price*node[root].total_amount;
return;
}
double distributor_price = node[root].price*(1+r/100);
for (auto &item:node[root].child){
node[item].price = distributor_price;
preTraverse(item,r);
}
}
注意点:
- 1、使用float保存数据会有好几个点无法通过。
提交结果:
AC代码:
#include <cstdio>
#include <vector>
using namespace std;
struct Node{
vector<int> child;//该结点的孩子
int total_amount;//叶子结点的货品数量
double price;//当前结点的售价
}node[100005];
double total_sales = 0 ;// 总售价
void preTraverse(int root,double r){
if(node[root].child.empty()){
// 零售商,计算总售价
total_sales += node[root].price*node[root].total_amount;
return;
}
double distributor_price = node[root].price*(1+r/100);
for (auto &item:node[root].child){
node[item].price = distributor_price;
preTraverse(item,r);
}
}
int main()
{
int N;//供应链总人数
double P,r;//供应商的单价,增量
scanf("%d %lf %lf",&N,&P,&r);
int K,id;
for (int i = 0; i < N; ++i) {
scanf("%d",&K);
if(i==0){
// 供应商
node[i].price = P;
}
if(K==0){
// 零售商
scanf("%d",&id);
node[i].total_amount = id;
} else {
// 经销商和供应商
for (int j = 0; j < K; ++j) {
scanf("%d",&id);
node[i].child.push_back(id);
}
}
}
preTraverse(0,r);
printf("%.1lf",total_sales);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。