1. 程式人生 > 實用技巧 >PAT(Advanced Level)A1090. Highest Price in Supply Chain

PAT(Advanced Level)A1090. Highest Price in Supply Chain

題意

供應鏈有3種人,零售商,經銷商和供應商,供應鏈上的人都可以從自己的供應商那裡以P的價格買入,而後以r%的漲幅賣出去,求最深的結點的售價是多少

思路

  • DFS找到最深的即可
    • 1⃣️沒有下一級的結點就是DFS遞迴退出的邊界
    • 不同層的銷售價格可以通過pow(1 + r,層數)方便地進行計算,而我們遞迴的引數之一depth的含義就是當前為第幾層
  • ⚠️
    • 題目給出的r是已經去掉%號的,所以要/100

程式碼

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
#include <math.h>
using namespace std;
int members, root;
struct node{
    vector<int> child;      //表示所有下一級的
};
double init_price, increment, ans = -1.0;   //對應其實價格,增量,和解
int sum = 0;    //統計個數
vector<node> v;
void dfs(int cur, int depth)
{
    if(v[cur].child.size() == 0)    //到達遞迴邊界,進行計算
    {
        double path = init_price * pow(1 + increment, depth);
        if(path > ans)
        {
            ans = path;
            sum = 1;
        }else if(path == ans){
            sum++;
        }
    }
    for(int i=0;i<v[cur].child.size();i++)      //遍歷當前結點cur的所有下一級
        dfs(v[cur].child[i], depth + 1);
}
int main()
{
    cin >> members >> init_price >> increment;
    increment /= 100;
    int t;
    v.resize(members);
    for(int i=0;i<members;i++)
    {
        scanf("%d", &t);
        if(t == -1)     //如果是-1,也就是root supplier,將其指向的設定為root
            root = i;
        else
            v[t].child.emplace_back(i);     //統計孩子
    }
    dfs(root, 0);
    printf("%.2f %d\n", ans, sum);
    return 0;
}