题目大意:
给出一颗销售供应树,根结点为0,在树根处售价为P,然后从根节点开始,每一层的货物的价格就会在上一层的价格上增加r%,要求输出售价最高的零售商和其个数。
算法思路:
此题和1079是一样的题目,采用树的遍历(先序遍历或者层序遍历)获取所有节点的售价,在遍历到叶子节点的时候就更新最高售价和对应的零售商的个数。 由于给的是当前结点和其父亲的关系,所以每次输入parent的时候,就将其孩子结点添加其中node[parent].child.push_back(i)
,
然后对于parent==-1
的情况,使用root=parent
,保存根节点位置
注意点:
- 1、尽量不要使用float保存数据。
提交结果:
AC代码:
#include <cstdio>
#include <vector>
using namespace std;
struct Node{
double price;//当前结点的售价
vector<int> child;
}node[100005];
double highest_price = -1 ;// 最高售价
int num;// 最高售价的零售商的个数
void preTraverse(int root,double r){
if(node[root].child.empty()){
// 零售商,获得最高售价
if(highest_price<node[root].price){
num = 1;
highest_price = node[root].price;
} else if(highest_price==node[root].price){
++num;
}
return;
}
double distributor_price = node[root].price*(1+r/100);
for (auto &item:node[root].child){
node[item].price = distributor_price;
preTraverse(item,r);
}
}
int main()
{
int N;//供应链总人数
double P,r;//供应商的单价,增量
scanf("%d %lf %lf",&N,&P,&r);
int root,parent;
for (int i = 0; i < N; ++i) {
scanf("%d",&parent);
if(parent==-1){
// 当前节点为根节点,保存位置和售价
root = i;
node[i].price = P;
} else {
// 保存父子关系
node[parent].child.push_back(i);
}
}
preTraverse(root,r);
printf("%.2lf %d",highest_price,num);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。