Fork me on GitHub

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算出每个节点的层数并统计最高层数的个数,最后输出计算后的结果。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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%