PAT(Advanced Level)A1090. Highest Price in Supply Chain
阿新 • • 發佈:2020-10-04
題意
供應鏈有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; }