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则表明该结点为叶子结 ...
随机推荐
- 如何拯救被Due逼疯的留学生们?
Final季又到了,还有多少paper,多少project没完成?每年一到这个时候,手忙脚乱赶各种进度就成了留学小伙伴们共同的日常.任务多,不知道从何开始,拖延,烦躁……到底该怎么办?小编今天为各位介 ...
- Linux系统发现新恶意软件
导读 安全研究人员发现了一种新的Linux恶意软件,它似乎是由中国黑客创建的,并被用作远程控制受感染系统的手段. 这个恶意软件命名为HiddenWasp,由用户模式rootkit,木马和初始部署脚本组 ...
- CSS屏幕适配尺寸样式
/* 大屏幕 :大于等于1200px*/@media (min-width: 1200px) { ... } /*默认*/@media (min-width: 980px){...} /* 平板电脑和 ...
- 解决CSS背景模糊
.banner{ background:url(banner.jpg); -moz-background-size:100% 100%; background-size:100% 100%; }
- springboot#interceptor
_ 拦截器相对与过滤器Filter 而言,拦截器是spring中的概念.过滤器是servlet中的概念.在spring中肯定是优先使用拦截器Interceptor的. public class My1 ...
- 157-PHP strrchr函数输出最后一次出现字母p的位置到字符串结尾的所有字符串
<?php $str='PHP is a very good programming language!'; //定义一个字符串 echo strrchr($str,'o'); //输出最后一次 ...
- 一个swift版简单的用户名和密码输入textField
http://www.code4app.com/thread-31992-1-1.html 常见的动画提交按钮 http://www.code4app.com/thread-32239-1-1.htm ...
- ACM-Subset sum
题目描述: Subset Sum Tags: 回溯 子集和问题的一个实例为〈 S,t 〉.其中,S={x1 ,x2 ,…, xn }是一个正整数的集合,c是一个正整数.子集和问题判定是否存在S的一个子 ...
- mysql 统计值为NULL不为0的问题
今天在写一个接口的时候是要统计数据,但是突然发现报错,类型不匹配的问题,我返回的是Int类型的为啥会类型不匹配呢,真的是奇怪 然后把代码丢到正式环境里面运行一下,发现值为null 一下子就傻眼了,不可 ...
- UML图的种类
一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语 ...