pat A1079 Total Sales of Supply Chain

记录一下刷pat的感想和代码。

题目:

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

题意:
易看出本题供应商、经销商和零售商的关系是个树,零售商是叶子结点,所求为零售商的销售额,欲求销售额,需要知道每个零售商的深度,所以是一个树的遍历题。

思路:
1、因为输入是以节点编号关系给出,所以用树的静态写法(习惯原因用vector容器),节点的结构要包括深度、孩子数组和可能需要的销售量(叶子结点)。
2、bfs的过程中,在子节点压入队列时,将其深度设置为原节点深度加一,根节点计0.
3、也可以用dfs,递归时,深度参数加一即可。

注意:
1、因为太久没用标准化输入输出,有些生疏,列举在此:

double a;
float b;
printf("%f %f",&a,&b);//输出时,单双精度都是f
scanf("%lf %f",&a,&b);//输入时,双精度是lf
printf("%.1f",a);//此为保留一位小数

2、一直懒得仔细想所以每次都自己写的乘方函数。。。:

#include <math.h>
double pow(double a,double b);//函数原型
pow(a,b)//a的3次方

代码:(深度写成height,懒得改了…)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node{
	int height;
	int isret;//若是零售商,值为售量,反之为-1
	vector <int> child;
};
vector <node> tree;
void bfs(int root){
	queue <int> q;
	q.push(root);
	while(!q.empty()){
		int temp = q.front();
		q.pop();
		for(int i = 0;i < tree[temp].child.size();i++){
			q.push(tree[temp].child[i]);
			tree[tree[temp].child[i]].height = tree[temp].height + 1;
		} 
	}
}
double pow(double x,int n){
	double t = 1.0;
	for(int i = 0;i < n;i++)
		t *= x;
	return t;
}
int main(){
	int n;
	double p,r;
	scanf("%d%lf%lf",&n,&p,&r);//值得记录
	r = r / 100;
	tree.resize(n);
	for(int i = 0;i < n;i++){
		int k;
		scanf("%d",&k);
		tree[i].isret = -1;
		for(int j = 0;j < k;j++){
			int tempchild;
			scanf("%d",&tempchild);
			tree[i].child.push_back(tempchild);
		}
		if(k == 0){
			int tempamount;
			scanf("%d",&tempamount);
			tree[i].isret = tempamount;
		}
	}
	tree[0].height = 0;
	bfs(0);
	double res = 0.0;
	for(int i = 0;i < n;i++){
		if(tree[i].isret != -1){
			res += tree[i].isret * p * pow(1.0 + r,tree[i].height);
		}
	}
	printf("%.1f",res);

	return 0;
}

另:
把dfs求层数的代码补充在此:

void dfs(int root,int depth){
	if(tree[root].child.size() == 0) return;
	tree[root].depth = depth + 1;
	for(int i = 0;i < tree[root].child.size();i++){
		dfs(tree[tree[root].child[i]],depth + 1);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值