PAT Advanced 1079 Total Sales of Supply Chain (25) [DFS,BFS,树的遍历]
题目
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 afer 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
题目分析
供应商,经销商,零售商组成一棵树,每条销售渠道对应树的一条从根节点到叶结点的路径,已知每条渠道商品数,原价格,每个经销商和零售商价格增率,求总销售额
翻译:已知每个节点子节点数,及根节点到每一个子节点路径上的商品数,商品的原价p,每一个代理商品价格倍增率r%,求销售总金额
解题思路
思路 01(DFS 最优)
- 邻接表表示树,int cns[n]记录节点子节点数,max_h记录最大层数
- dfs深度优先遍历,遇到叶子节点(当前节点子节点数为0)计算当前路径销售金额,dfs函数参数price记录当前层价格
思路 02(BFS)
- 邻接表表示树,int cns[n]记录节点子节点数,max_h记录最大层数,int h[n]记录节点所在层数,int pro[n]记录对应层的叶子节点数
- bfs广度优先遍历,遇到叶子节点(当前节点子节点数为0)记录当前路径的产品数到对应层pro[h[index]]中
- 遍历每一层叶子结点数,统计当前层销售价,并求出总销售价
知识点
- bfs使用int h[n]数组记录节点的层数
- dfs函数参数h记录当前处理节点的层数
Code
Code 01(DFS 最优)
#include <iostream>
#include <vector>
using namespace std;
const int maxn=100000;
vector<int> nds[maxn];
int cns[maxn];//记录子结点数
double p,r,sales;
void dfs(int index,double price){
if(cns[index]==0){
//retailer
sales+=nds[index][0]*price;
return;
}
for(int i=0;i<nds[index].size();i++){
dfs(nds[index][i],price*(1+r*0.01));
}
}
int main(int argc,char * argv[]){
int n,k,cid;
scanf("%d %lf %lf",&n,&p,&r);
for(int i=0;i<n;i++){
scanf("%d",&cns[i]);
int len=cns[i]==0?1:cns[i];
for(int j=0;j<len;j++){
scanf("%d",&cid);
nds[i].push_back(cid);
}
}
dfs(0,p);
printf("%.1f",sales);
}
Code 02 (DFS)
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 100010;
vector<int> nds[maxn];
int pn[maxn]; //记录经销商产品数量
double r,total;
void dfs(int index, double p) {
if(nds[index].size()==0) {
total+=p*pn[index];
return;
}
for(int i=0; i<nds[index].size(); i++)
dfs(nds[index][i], p*(1+r));
}
int main(int argc,char * argv[]) {
int n,k,cid;
double p;
scanf("%d %lf %lf", &n, &p, &r);
for(int i=0; i<n; i++) {
scanf("%d", &k);
if(k==0)scanf("%d",&pn[i]);
for(int j=0; j<k; j++) {
scanf("%d", &cid);
nds[i].push_back(cid);
}
}
r=r*0.01;
dfs(0,p);
printf("%.1f",total);
return 0;
}
Code 03(BFS)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=100000;
vector<int> nds[maxn];
int cns[maxn],pro[maxn],h[maxn],max_h;//cns记录子结点数,pro记录层叶子结点数
double p,r,sales;
void bfs(){
queue<int> q;
q.push(0);
while(!q.empty()){
int index = q.front();
q.pop();
max_h=max(max_h,h[index]);
if(cns[index]==0){
pro[h[index]]+=nds[index][0];
}else{
for(int i=0;i<nds[index].size();i++){
h[nds[index][i]]=h[index]+1;
q.push(nds[index][i]);
}
}
}
}
int main(int argc,char * argv[]){
int n,k,cid;
scanf("%d %lf %lf",&n,&p,&r);
for(int i=0;i<n;i++){
scanf("%d",&cns[i]);
int len=cns[i]==0?1:cns[i];
for(int j=0;j<len;j++){
scanf("%d",&cid);
nds[i].push_back(cid);
}
}
h[0]=0;
bfs();
for(int i=0;i<=max_h;i++){
sales+=pro[i]*p;
p*=(1+r*0.01);
}
printf("%.1f",sales);
return 0;
}
PAT Advanced 1079 Total Sales of Supply Chain (25) [DFS,BFS,树的遍历]的更多相关文章
- 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 ...
- 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 (25)-求数的层次和叶子节点
和下面是同类型的题目,只不过问的不一样罢了: 1090. Highest Price in Supply Chain (25)-dfs求层数 1106. Lowest Price in Supply ...
- PAT 甲级 1079 Total Sales of Supply Chain
https://pintia.cn/problem-sets/994805342720868352/problems/994805388447170560 A supply chain is a ne ...
- 1079. Total Sales of Supply Chain (25)
时间限制 250 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...
- 1079. Total Sales of Supply Chain (25) -记录层的BFS改进
题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...
- PAT Advanced 1106 Lowest Price in Supply Chain (25) [DFS,BFS,树的遍历]
题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)– everyone in ...
- PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
树的遍历. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- 【PAT甲级】1079 Total Sales of Supply Chain (25 分)
题意: 输入一个正整数N(<=1e5),表示共有N个结点,接着输入两个浮点数分别表示商品的进货价和每经过一层会增加的价格百分比.接着输入N行每行包括一个非负整数X,如果X为0则表明该结点为叶子结 ...
随机推荐
- 反射①:如何获取class对象六种方法
获取class对象的六种方法 了解:class类——是Java反射机制的入口,封装了一个类或接口的运行信息,通过调用Class类的方法可以获取这些信息,其特点如下: 1.该类在java.lang包中: ...
- etcd入门
简介 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库. etcd内部采用raft协议作为一致性算法,基于Go语言实现. et ...
- Mysql 模糊查询 转义字符
MySQL的转义字符“\” \0 一个ASCII 0 (NUL)字符. \n 一个新行符. \t 一个定位符. \r 一个回车符. \b 一个退 ...
- Redis 详解 (六) RDB 持久化
目录 1.RDB 简介 2.触发方式 ①.自动触发 ②.手动触发 3.恢复数据 4.停止 RDB 持久化 5.RDB 的优势和劣势 6.RDB 自动保存的原理 前面我们说过,Redis 相对于 Me ...
- 在远程服务器上执行本地的shell脚本
在远程服务器上执行本地的shell脚本 [root@localhost zzx]# sh echoip.sh 192.168.67.131[root@localhost zzx]# ssh root@ ...
- python计算:pi/4=1-1/3+1/5-1/7+…
当有一项的绝对值小于10e-6停止计算 def cul() : ans = 0;add = 1 sign = 1 while(1/add>10**(-6)) : ans = ans + sign ...
- 四十三、在SAP中初始化勾选值
一.上代码 二.运行时,勾选框会被自动勾选中 三.表单如下
- 【BZOJ4237】稻草人
题意 给定平面上 \(N\) 个关键点,询问有多少个矩形满足左下和右上各有一个关键点,且矩形中间没有关键点. \(N\le 2\cdot 10^5\) . 题解 我们按 \(x\) 排序分治,对于左右 ...
- Ctrl + c 强制退出
linux 使用cat 命令进入一个很大的文件,一直在不停地显示内容,让它停止的方法,可以用Ctrl + c 强制退出
- 再战希捷:西部数据透露96层闪存已用于消费级SSD
导读 96层堆叠3D NAND闪存已经成为行业主流,包括西部数据这样的传统机械硬盘大厂,也在逐步普及96层闪存,并已经用于消费级SSD. 96层堆叠3D NAND闪存已经成为行业主流,包括西部数据这样 ...