题目

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 最优)

  1. 邻接表表示树,int cns[n]记录节点子节点数,max_h记录最大层数
  2. dfs深度优先遍历,遇到叶子节点(当前节点子节点数为0)计算当前路径销售金额,dfs函数参数price记录当前层价格

思路 02(BFS)

  1. 邻接表表示树,int cns[n]记录节点子节点数,max_h记录最大层数,int h[n]记录节点所在层数,int pro[n]记录对应层的叶子节点数
  2. bfs广度优先遍历,遇到叶子节点(当前节点子节点数为0)记录当前路径的产品数到对应层pro[h[index]]中
  3. 遍历每一层叶子结点数,统计当前层销售价,并求出总销售价

知识点

  1. bfs使用int h[n]数组记录节点的层数
  2. 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,树的遍历]的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 1079. Total Sales of Supply Chain (25)-求数的层次和叶子节点

    和下面是同类型的题目,只不过问的不一样罢了: 1090. Highest Price in Supply Chain (25)-dfs求层数 1106. Lowest Price in Supply ...

  4. PAT 甲级 1079 Total Sales of Supply Chain

    https://pintia.cn/problem-sets/994805342720868352/problems/994805388447170560 A supply chain is a ne ...

  5. 1079. Total Sales of Supply Chain (25)

    时间限制 250 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...

  6. 1079. Total Sales of Supply Chain (25) -记录层的BFS改进

    题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...

  7. PAT Advanced 1106 Lowest Price in Supply Chain (25) [DFS,BFS,树的遍历]

    题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)– everyone in ...

  8. PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)

    树的遍历. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  9. 【PAT甲级】1079 Total Sales of Supply Chain (25 分)

    题意: 输入一个正整数N(<=1e5),表示共有N个结点,接着输入两个浮点数分别表示商品的进货价和每经过一层会增加的价格百分比.接着输入N行每行包括一个非负整数X,如果X为0则表明该结点为叶子结 ...

随机推荐

  1. 《分布式消息中间件实践》P153

    问题:我直接把作者的源码拷贝下来(包括xml,resource等,作者应该使用的是Eclipse,我复制到IDEA上),依赖加上.执行P153的步骤,报错如下: Exception in thread ...

  2. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  3. Golang的基础数据类型-布尔型

    Golang的基础数据类型-布尔型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.bool类型概述 bool类型的取值范围: bool类型的值只有两种,其值不为真即为假,可以用 ...

  4. 使用css3的Flex布局实现列表展示

    实现效果图如下: 通过css3样式实现(部分代码): .box { display: flex; flex-wrap:wrap; justify-content:space-between; alig ...

  5. Ubuntu不会放弃32位应用程序

    Ubuntu 开发人员澄清,人们以为 Ubuntu 将在 Ubuntu 19.10 和后续版本中放弃对运行 32 位应用程序的支持,但“根本不是这种情况”.那么这究竟是怎么一回事呢?前几天 Ubunt ...

  6. asp.net mvc3用file上传文件大小限制问题

    在Windows2008下,如果上传比较大的文件,可能会出现404错误,(请求筛选模块被配置为拒绝超过请求内容长度的请求). 可通过如下方法解决: 打开URTracker根目录下的web.config ...

  7. NRF52840与NRF52832的性能区别

    蓝牙版本的不断更新,大部分客户慢慢都向往着蓝牙5.0.当然对于前不久NORDIC刚出的蓝牙5.0 NRF52840,很多人都还不是很了解.NRF52840可以说是NRF52832的超强升级版,虽然同样 ...

  8. 01-JAVA语言基础——课程作业1—编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。

    1.题目:编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 2.程序设计思想: 通过运行配置输入数字后,其保存类型为String类型,因此需要采用Integer.valueOf(arg)将 ...

  9. vuejs+thinkphp5+phpsocketIO+timer数据及时更新

    1.安装thinkphp5.0以上版本包含workerman框架2.composer安装composer require workerman/phpsocket.io3.vue中调用需要加载weapp ...

  10. 5. 支撑高并发,高可用,海量数据备份恢复的Redis重要性

    商品详情页的架构实现 缓存架构 第一块儿,要掌握的很好的,就是redis架构 高并发,高可用,海量数据,备份,随时可以恢复,缓存架构如果要支撑这些要点,首先呢,redis就得支撑 redis架构,每秒 ...