树的遍历A1079 Total Sales of Supply Chain,叶子节点有货物

1079 Total Sales of Supply Chain 分数 25

A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone involved in moving a product from supplier to customer.

Starting from one root supplier, everyone on the chain buys products from one's supplier in a price P and sell or distribute them in a price that is r% higher than P. Only the retailers will face the customers. It is assumed that each member in the supply chain has exactly one supplier except the root supplier, and there is no supply cycle.

Now given a supply chain, you are supposed to tell the total sales from all the retailers.

供应链是零售商的网络(零售商), 分销商(经销商), 和供应商(供应商)-- 参与将产品从供应商转移到客户的每个人。

从一个根供应商开始,链上的每个人都以P的价格从供应商那里购买产品,并以比P高r%的价格出售或分销。只有零售商才会面对客户。假设供应链中的每个成员只有一个供应商,除了根供应商,并且不存在供应周期。

现在给定一个供应链,你应该知道所有零售商的总销售额。

Input Specification:

Each input file contains one test case. For each case, the first line contains three positive numbers: N (≤105), the total number of the members in the supply chain (and hence their ID's are numbered from 0 to N−1, and the root supplier's ID is 0); P, the unit price given by the root supplier; and r, the percentage rate of price increment for each distributor or retailer. Then N lines follow, each describes a distributor or retailer in the following format:

Ki ID[1] ID[2] ... ID[Ki]

where in the i-th line, Ki is the total number of distributors or retailers who receive products from supplier i, and is then followed by the ID's of these distributors or retailers. Kj being 0 means that the j-th member is a retailer, then instead the total amount of the product will be given after Kj. All the numbers in a line are separated by a space.

每个输入文件包含一个测试用例。对于每种情况,第一行包含三个正数:N(≤105),即供应链中成员的总数(因此他们的ID从0到N−1编号,根供应商的ID为0);P、 根供应商给出的单价;以及r,每个分销商或零售商的价格增量的百分比。接下来是N行,每行以以下格式描述分销商或零售商:

Ki ID[1]ID[2]。。。ID[Ki]

其中,在第i行中,Ki是从供应商i处接收产品的分销商或零售商的总数,然后是这些分销商或经销商的ID。Kj为0意味着第j个成员是零售商,那么产品的总额将在Kj之后给出。一行中的所有数字都用空格隔开。

Output Specification:

For each test case, print in one line the total sales we can expect from all the retailers, accurate up to 1 decimal place. It is guaranteed that the number will not exceed 1010.

对于每个测试用例,在一行中打印我们可以从所有零售商那里获得的总销售额,精确到小数点后1位。可以保证这个数字不会超过1010。

树的遍历

输入

第一行 总节点个数n,根节点单价p,利润率r

下面n行为第i个节点有几个孩子,孩子分别是哪些节点 节点0到n-1

如果没有孩子,则第一个数为0,第二个数是该叶子节点的货物量

输出

所有叶子节点的价格和

单个叶子节点价格=货物量*单价,其中单价为p*pow(1+r,depth)

r要除以100

Sample Input:

10 1.80 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3

Sample Output:

42.4
#include<iostream>
#include<vector>
#include<cmath>
#include<cstdio>
using namespace std;

const int maxn=100010;

struct node{
    vector<int> child;
    double data;//节点的货物量
}Node[maxn];

int n;
double p,r,ans=0;//ans叶子的总价格=层数单价*货物量


//此题输出所有叶子的和,不是输出最大层叶子,因此不需要定义maxdepth,num与a1090不一样

void dfs(int index,int depth){
    if(Node[index].child.size()==0){//当前节点的孩子个数为0,说明到达了叶节点
        ans+=Node[index].data*p*pow(1+r,depth);
        return;
    }
    //如果没有到达叶子节点,就dfs直至访问到了叶子节点
    for(int i=0;i<Node[index].child.size();i++){
        dfs(Node[index].child[i],depth+1);
    }
}


int main(){
    int k,child;
    scanf("%d%lf%lf",&n,&p,&r);
    r/=100;
    for(int i=0;i<n;i++){
        scanf("%d",&k);
        if(k==0){//如果k为0
            scanf("%lf",&Node[i].data);
        }
        else{
            for(int j=0;j<k;j++){
                scanf("%d",&child);
                Node[i].child.push_back(child);
            }
        }
    }
    dfs(0,0);
    printf("%.1f",ans);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值