PAT A1090 Highest Price in Supply Chain
Sample Input:
9 1.80 1.00
1 5 4 4 -1 4 5 3 6
Sample Output:
1.85 2
-
分析:
找最大深度的结点 -
思路 1:
DFS,每遍历到叶子结点
1)判断深度是否比全局Max大,大则更新 -> Max最终存的即为最大深度;
2)计数:如果> Max
,cnt重置为1,如果== Max
,cnt++(这样只保留了,Max达到最大值以后,重复得路径数) -
code 1:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n;
double p, r; //r比率 r%
vector<int> child[maxn];
int Max = 0, cnt = 0; //!!!Wrong 1: cnt必须设为0,设为1出错了 -》 空树
void DFS(int idex, int depth){
if(child[idex].size() == 0){
if(depth > Max){
Max = depth;
cnt = 1; //有更大的cnt重置为1
}else if(depth == Max) cnt++; //只有最大 且 dep相等的cnt被累加 并保留
return;
}
for(int i = 0; i < child[idex].size(); ++i){
DFS(child[idex][i], depth+1);
}
}
int main(){
scanf("%d %lf %lf", &n, &p, &r);
r /= 100;
int root, father;
for(int i = 0; i < n; ++i){
scanf("%d", &father);
if(father == -1) root = i;
else child[father].push_back(i);
}
DFS(root, 0);
double sale = p * pow(1+r, Max);
printf("%.2f %d\n", sale, cnt);
return 0;
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
vector<int> node[maxn];
int num = 0;
double Highest = 0.0;
void DFS(int id, double p, double r){
if(node[id].size() == 0){
double price = p;
if(price > Highest){
Highest = price;
num = 1;
}else if(price == Highest){
num++;
}
return;
}
for(int i = 0; i < node[id].size(); ++i){
int nex = node[id][i];
DFS(nex, p * r , r);
}
}
int main(){
int n, root;
double p, r;
scanf("%d %lf %lf", &n, &p, &r);
for(int i = 0; i < n; ++i){
int tmp;
scanf("%d", &tmp);
if(tmp == -1) root = i;
else node[tmp].push_back(i);
}
DFS(root, p, r * 0.01 + 1);
printf("%.2lf %d\n", Highest, num);
return 0;
}
-
思路: BFS
-
code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
vector<int> node[maxn];
double rate[maxn];
void BFS(int start, double p, double r, double & highest, int & cnt)
{
rate[start] = p;
queue<int> q;
q.push(start);
while(!q.empty())
{
int now = q.front();
q.pop();
if(node[now].size() == 0)
{
if(rate[now] > highest)
{
highest = rate[now];
cnt = 1;
}else if(rate[now] == highest)
{
cnt++;
}
}
for(int i = 0; i < node[now].size(); ++i)
{
int nex = node[now][i];
rate[nex] = rate[now] * (1.0 + r);
q.push(nex);
}
}
}
int main()
{
int n, root;
double p, r;
scanf("%d %lf %lf", &n, &p, &r);
r /= 100.0;
for(int i = 0; i < n; ++i)
{
int tmp;
scanf("%d", &tmp);
if(tmp != -1)
{
node[tmp].push_back(i);
}else root = i;
}
double highest = 0;
int cnt = 0;
BFS(root, p, r, highest, cnt);
printf("%.2f %d", highest, cnt);
return 0;
}