PAT-1079 Total Sales of Supply Chain (树的遍历)
1079. Total Sales of Supply
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:
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.
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
题目大意:给出一颗由商品供应关系构成的树,最初的供应商即为树的根节点,要求计算所有零售商(即树的叶子节点)的销售额。题目首先给出三个常数,n(树的节点数),p(初始价格),r(每出售一次的增长率),然后按照节点
id 的顺序输入n行。首先输入一个整数k,如果 k>0,那么紧随其后的是该节点的k个子节点;如果k=0,则表示该节点是叶子节点,接着给出该节点的销售商品数量。
主要思想:1.
最直接的想法就是在接受输入时用一个数组保存每个节点的父节点,当遇到叶子节点时用容器保存该节点的id 及销售量信息。然后对于容器中的所有叶子节点,求出它们的深度(经历了几次涨价),然后求出销售总额。需要注意的是在求深度的时候应该用数组保存每个求出的节点的深度,这样求未知节点时可以利用这些数据来节约时间,否则有些用例会超时。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
typedef struct {
int id; //经销商的id
int num; //商品数量
} retailer;
int father[100000]; //该节点的父节点
int level[100000]; //该节点所处层数
int get_level(int id); int main(void) {
int n, i, j;
double p, r;
vector<retailer> vec;
vector<retailer>::iterator iter; cin >> n >> p >> r;
int k, num, id;
for (i = 0; i < n; i++) {
cin >> k;
if (k == 0) {
cin >> num;
retailer re;
re.id = i;
re.num = num;
vec.push_back(re);
}
else {
for (j = 0; j < k; j++) {
cin >> id;
father[id] = i;
}
}
}
double total = 0;;
for (iter = vec.begin(); iter != vec.end(); iter++) {
/*
//开始用从每个叶子节点迭代回根节点求深度,会超时
int count = 0;
for (i = iter->id; i != 0; i = father[i])
count++;
total += (iter->num) * p * pow(1 + r/100, count);
*/ total += (iter->num) * p * pow(1 + r/100, get_level(iter->id));
}
printf("%.1f\n", total); return 0;
} //获取节点的层数
int get_level(int id) {
if (id == 0) return 0;
if (level[id] == 0)
level[id] = get_level(father[id]) + 1;
return level[id];
}
2.此题还可以利用 dfs 或 bfs 来对树进行遍历,利用结构体的数组来储存所有节点,类似于图的邻接表表示法。
typedef struct {
int num; //如果是叶子节点,则表示销售量
vector<int> child; //该节点的所有子节点
} node;
vector<node> v; //树中节点的集合
在使用dfs的时候可以将深度作为递归函数的参数,则可以很方便求出每一个叶节点的深度,并在递归中累加出总销售额。
dfs(0, 0);
void dfs(int id, int depth) {
if (v[id].child.size() == 0) { //表明是叶子节点
sum += v[id].num * p * pow(1 + r/100, depth);
return;
}
for (int i = 0; i < v[id].child.size(); i++)
dfs(v[id].child[i], depth + 1); //进入下一层深度加1
return;
}
PAT-1079 Total Sales of Supply Chain (树的遍历)的更多相关文章
- PAT 1079 Total Sales of Supply Chain[比较]
1079 Total Sales of Supply Chain(25 分) A supply chain is a network of retailers(零售商), distributors(经 ...
- PAT 1079. Total Sales of Supply Chain
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- 1079. Total Sales of Supply Chain (25)【树+搜索】——PAT (Advanced Level) Practise
题目信息 1079. Total Sales of Supply Chain (25) 时间限制250 ms 内存限制65536 kB 代码长度限制16000 B A supply chain is ...
- 1079 Total Sales of Supply Chain ——PAT甲级真题
1079 Total Sales of Supply Chain A supply chain is a network of retailers(零售商), distributors(经销商), a ...
- PAT 甲级 1079 Total Sales of Supply Chain (25 分)(简单,不建树,bfs即可)
1079 Total Sales of Supply Chain (25 分) A supply chain is a network of retailers(零售商), distributor ...
- PAT Advanced 1079 Total Sales of Supply Chain (25) [DFS,BFS,树的遍历]
题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)– everyone in ...
- PAT 甲级 1079 Total Sales of Supply Chain
https://pintia.cn/problem-sets/994805342720868352/problems/994805388447170560 A supply chain is a ne ...
- PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
树的遍历. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- 1079. Total Sales of Supply Chain (25) -记录层的BFS改进
题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...
- 1079. Total Sales of Supply Chain (25)
时间限制 250 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...
随机推荐
- 第三方库 正则表达式re模块
正则表通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式通常缩写成“regex”,单数有regexp.regex,复数有regexps.regexes.regexen. 正则表达式是对字 ...
- Python-四则运算-蔡晓晴,杜婷萱
github链接:https://github.com/Amy-CC/Arithmetic-Operation 一.需求 1.使用-n 参数控制生成题目的个数 2.使用-r 参数控制题目中数值(自然数 ...
- cobbler的网页操作
需求:安装一台服务器 1.指定两块网卡一块外网一块内网2.内网ip10.0.0.62外网为172.16.1.623.主机名为m02 开始吧! 1.添加镜像文件 2.创建ks文件 编写ks文件 附:ks ...
- PHP命令执行学习总结
前言 最近学习了PHP命令执行,内容比较多,把自己学到的总结下来,加深理解,水平有限,欢迎大佬斧正. 什么是PHP命令注入攻击? Command Injection,即命令注入攻击,是指由于Web应用 ...
- 学习vue第五节,vue中使用class和style的css样式
vue中使用class样式 数组 <h1 :class="['red', 'thin']">这是一个H1</h1> 数组中使用三元表达式 <h1 :c ...
- E - Help Jimmy POJ - 1661 dp
E - Help Jimmy POJ - 1661 这个题目本身不是很难,但是可以更加优化这个写法. 开始是n*n #include <cstdio> #include <cstri ...
- JAVA基础篇 之 方法的重载
任何程序语言都具备了一项重要的特性就是对名字的运用.当创建一个对象时,也就给此对象分配到的存储空间取了一个名字.所谓方法则是给某个动作取的名字.通过使用名字你可以引用所有的对象和方法. 将人类 ...
- 10_CSS入门和高级技巧(8)
图片透明 先来复习一下盒子的透明问题: opacity:0.6; 介于0~1之间,为了让IE兼容,我们要使用IE自己的滤镜: filter:alpha(opacity=60); 盒子的透明,会让里面的 ...
- 【2020Java最新学习路线】写了很久,这是一份最适合普通大众、科班、非科班的路线
点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...
- Linux开机自启动脚本的总结
一.在/etc/rc.local中添加 如果不想将脚本粘来粘去,或创建链接什么的, 则: step1. 先修改好脚本,使其所有模块都能在任意目录启动时正常执行; step2. 再在/etc/rc.lo ...