1090 供应链最高价格

发布时间 2023-04-21 20:16:34作者: 回忆、少年

供应链是由零售商,经销商和供应商构成的销售网络,每个人都参与将产品从供应商转移到客户的过程。

整个销售网络可以看作一个树形结构,从根部的供应商往下,每个人从上一级供应商中买入商品后,假定买入价格为 P,则会以高出买入价 r% 的价格向下出售。

只有零售商(即叶节点)可以直接将产品销售给顾客。

现在,给定整个销售网络,请你计算零售商能达到的最高销售价格。

输入格式

第一行包含三个数,N 表示供应链总成员数(所有成员编号为 0 到 N1);P 表示根部供应商的产品销售价格;r,表示溢价百分比。

第二行包含 N 个数字,第 i 个数字 Si 是编号为 i 的成员的上级供应商的编号。根部供应商的 Sroot 为 -1。

输出格式

输出零售商可达到的最高销售价格,保留两位小数,以及可达到最高销售价格的零售商的数量。

数据范围

1N10^5,
0<P1000,
0<r50,
最终答案保证不超过 10^10

输入样例:

9 1.80 1.00
1 5 4 4 -1 4 5 3 6

输出样例:

1.85 2

代码实现:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1e5+5;
vector<int>v[N];
int level[N],vis[N];
int n,res;
double p,r;
void bfs(int x){
    queue<pair<int,int> >q;
    q.push({x,0});
    while(q.size()){
        int dis=q.front().second;
        int s=q.front().first;
        q.pop();
        if(vis[s])continue;
        vis[s]=1;
        level[s]=dis;
        res=max(res,dis);
        for(int i=0;i<v[s].size();i++){
            q.push({v[s][i],dis+1});
        }
    }
}
int main(){
    cin>>n>>p>>r;
    int root=0;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        if(x==-1)root=i;
        if(x!=-1)v[x].push_back(i);
    }
    bfs(root);
    int cnt=0;
    for(int i=0;i<res;i++)p*=(1+r/100);
    for(int i=0;i<n;i++)if(level[i]==res)cnt++;
    printf("%.2lf %d",p,cnt);
    return 0;
}