【PAT甲级 - C++题解】1079 Total Sales of Supply Chain

简介: 【PAT甲级 - C++题解】1079 Total Sales of Supply Chain

1079 Total Sales of Supply Chain


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.

Input Specification:



1.png

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.

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


题意


供应链是由零售商,经销商和供应商构成的销售网络,每个人都参与将产品从供应商转移到客户的过程。


整个销售网络可以看作一个树形结构,从根部的供应商往下,每个人从上一级供应商中买入商品后,假定买入价格为 P ,则会以高出买入价 r% 的价格向下出售。


只有零售商(即叶节点)可以直接将产品销售给顾客。


现在,给定整个销售网络,请你计算所有零售商的总销售额。


第一行包含三个数,N 表示供应链总成员数(所有成员编号从 0 到 N−1 ,根部供应商编号为 0 ),P 表示根部供应商的每件产品的售卖价格,r ,溢价百分比。


接下来 N 行,每行包含一个成员的信息,格式如下:

Ki ID[1] ID[2] … ID[Ki]

其中第 i 行,Ki 表示从供应商 i 直接进货的成员数,接下来 Ki 个整数是每个进货成员的编号。

如果某一行的 Kj0 ,则表示这是零售商,那么后面只会跟一个数字,表示卖给客户的产品总件数。


思路


我们可以存储每个结点的父结点,另外零售商的数值需要额外存储即当 k 为 0 的时候。

通过树形 DP 来计算树的深度,用一个 f 数组来存储每次计算的值,这样就可以排除重复计算的步骤。

计算总销售额时只用判断每次遍历的结点是否为叶子结点即可,然后通过公式 c[i] * P * pow(1 + R / 100, dfs(i)) 计算该叶子结点即零售商的销售额。其中 c[i] 表示该销售商卖给客户的产品总件数,P 表示产品的单位价格,pow(1 + R / 100, dfs(i)) 则是计算 1 + R/100 的 dfs(i) 次方即每多一层关系次方数就加 1 。

输出最终结果,注意结果只取小数点后一位。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
double P, R;
int p[N], c[N], f[N];
//树形DP,记忆化搜索
int dfs(int u)
{
    //剪枝,如果f[u]已经被计算过,直接返回即可
    if (f[u] != -1)    return f[u];
    //如果该结点没有父结点,直接返回0,同时更新f[u]
    if (p[u] == -1)    return f[u] = 0;
    return f[u] = dfs(p[u]) + 1;
}
int main()
{
    cin >> n >> P >> R;
    //输入结点信息,存储每个结点的父结点
    memset(p, -1, sizeof p);
    for (int i = 0; i < n; i++)
    {
        int k;
        cin >> k;
        for (int j = 0; j < k; j++)
        {
            int id;
            cin >> id;
            p[id] = i;    //记录供应商是谁
        }
        if (!k)  cin >> c[i]; //如果是零售商,则另外存储
    }
    memset(f, -1, sizeof f);
    //计算总销售额
    double res = 0;
    for (int i = 0; i < n; i++)
        if (c[i])
            res += c[i] * P * pow(1 + R / 100, dfs(i));
    printf("%.1lf\n", res);
    return 0;
}


目录
相关文章
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
40 0
|
算法 C++
【PAT甲级 - C++题解】1044 Shopping in Mars
【PAT甲级 - C++题解】1044 Shopping in Mars
62 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
55 0
|
存储 C++ 容器
【PAT甲级 - C++题解】1057 Stack
【PAT甲级 - C++题解】1057 Stack
54 0
|
1天前
|
编译器 C语言 C++
|
1天前
|
编译器 C++
【C++】详解初始化列表,隐式类型转化,类静态成员,友元
【C++】详解初始化列表,隐式类型转化,类静态成员,友元
|
4天前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。
|
4天前
|
编译器 C++
【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 )
本文探讨了C++中类的成员函数,特别是取地址及const取地址操作符重载,通常无需重载,但展示了如何自定义以适应特定需求。接着讨论了构造函数的重要性,尤其是使用初始化列表来高效地初始化类的成员,包括对象成员、引用和const成员。初始化列表确保在对象创建时正确赋值,并遵循特定的执行顺序。
|
4天前
|
C语言 C++
【C++】日期类Date(详解)③
该文介绍了C++中直接相减法计算两个日期之间差值的方法,包括确定max和min、按年计算天数、日期矫正及计算差值。同时,文章讲解了const成员函数,用于不修改类成员的函数,并给出了`GetMonthDay`和`CheckDate`的const版本。此外,讨论了流插入和流提取的重载,需在类外部定义以符合内置类型输入输出习惯,并介绍了友元机制,允许非成员函数访问类的私有成员。全文旨在深化对运算符重载、const成员和流操作的理解。
|
4天前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。