PAT(甲级)渡劫(三)-Highest Price in Supply Chain (25)

PAT(甲级)渡劫(三)-Highest Price in Supply Chain (25)

题目大意:
  1. 从root supplier开始,卖出比进货价多r%,假设除了root supplier,其余每个都只从一家店进货,给你供应链,求最大的零售价。
  2. 给你供应链的总成员个数N(0,1,…,N-1),初始价格p,r,下一行给出第i个数表示第i个成员的supplier。root的为-1。
  3. 输出最高零售价,保留俩位小数,并输出最高价的个数。
算法思想:

题目直接给出了每个节点的孩子是什么,用一个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;
}
运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值