PAT(甲级)渡劫(三)-Highest Price in Supply Chain (25)
题目大意:
- 从root supplier开始,卖出比进货价多r%,假设除了root supplier,其余每个都只从一家店进货,给你供应链,求最大的零售价。
- 给你供应链的总成员个数N(0,1,…,N-1),初始价格p,r,下一行给出第i个数表示第i个成员的supplier。root的为-1。
- 输出最高零售价,保留俩位小数,并输出最高价的个数。
算法思想:
题目直接给出了每个节点的孩子是什么,用一个vector child[100000+5]记录下来就好,然后BFS算出每个节点的层数并统计最高层数的个数,最后输出计算后的结果。
代码如下:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
int n;
double p,r;
vector<int> child[100000 + 5];
int lever[100000 + 5];
int visited[100000 + 5];
int main(){
//freopen("in.txt","r",stdin);
cin>>n>>p>>r;
int a,root;
for(int i = 0 ; i < n ; i++){ // 输入供应链
cin>>a;
if(a == -1){
root = i; // 记录root结点
}else{
child[a].push_back(i); // 记录每个结点的孩子
}
}
// BFS统计每个结点的层数lever和最高层数以及最高层数的个数
deque<int> dq;
dq.push_back(root);
lever[root] = 0;
int maxlever = -1,maxlevernumbers = 1;
int now,children;
while(!dq.empty()){
now = dq.front();
if(lever[now] > maxlever){ // 如果当前结点的层次数大于maxlever,则maxlever等于该值,
// 且此时最大层次数改变为1
maxlever = lever[now];
maxlevernumbers = 1;
}else if(lever[now] == maxlever){
maxlevernumbers++;
}
dq.pop_front();
if(!child[now].empty()){ // 将该孩子的所有孩子入队列
for(int i = 0 ; i < child[now].size() ; i++){
children = child[now][i];
dq.push_back(children);
lever[children] = lever[now]+1;
}
}
}
// 计算并输出结果
printf("%.2f %d\n",(double)p*pow(1+r/100,maxlever),maxlevernumbers);
return 0;
}