[PAT] A1090 Highest Price in Supply Chain

题目大意

给出供应链总人数、起始货源的价格、每次经销的涨幅;以及供应链中所有人的直接供应者的编号。求出最大价格和销售最大价格的销售者的人数。

思路

显然整个供应链可以看作一棵树。题目转化为给一棵树,在树根出货物的价格为p,然后每往下走一层,价格增加r%,求深度最大的结点的价格,以及这个价格的叶子结点个数。
用结构体存储结点,每个结点用变长数组存储它的下家。DFS遍历求出每个结点的深度;再经过一次循环找到最深深度和最深深度的结点个数(也可以放在遍历时求出)。最后计算价格即可。

AC代码

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
#define MAX 100000
struct node {
	int level;
	vector<int>child;
};
node G[MAX];
void DFS(int v, int layer) {
	G[v].level = layer;
	for (int i = 0;i < G[v].child.size();i++)
		DFS(G[v].child[i], layer + 1);
}
int main() {
	int n, i, temp, s;
	double p, r;
	scanf("%d%lf%lf", &n, &p, &r);
	for (i = 0;i < n;i++) {
		scanf("%d", &temp);
		if (temp != -1)G[temp].child.push_back(i);
		else s = i;
	}
	DFS(s, 0);
	int maxLevel = 0, maxNum = 0;
	for (i = 0;i < n;i++) {
		if (G[i].level > maxLevel) {
			maxLevel = G[i].level;
			maxNum = 1;
		}
		else if (G[i].level == maxLevel)maxNum++;
	}
	for (i = 0;i < maxLevel;i++)p *= 1.0 + r / 100.0;
	printf("%.2lf %d", p, maxNum);
	return 0;
}
原文地址:https://www.cnblogs.com/yue36/p/13367313.html