[PAT解题报告] Highest Price in Supply Chain
和1079很像,简单地说就是根节点有个价格,孩子节点总是在父亲节点的价格上加一个比例,求最贵的节点——显然是个叶子。
题目输入给了每个节点i的父亲f[i], 除了根节点外,那么i的价格实际上就是a[f[i]] * r
(r是一个大于1的数),因此我们只要dfs计算就可以了,当然已经计算过的结果不要重复计算,我用了-1.e6表示负无穷,然后get一下每个节点的价格选出最大的就可以了。简单题。
代码:
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const double eps = 1.e-8;
int f[100005];
double a[100005];
double r;
double get(int x) {
if (a[x] > -1.) {
return a[x];
}
return a[x] = get(f[x]) * r;
}
int main() {
int n;
double p;
scanf("%d%lf%lf",&n,&p,&r);
r /= 100.;
r += 1.;
for (int i = 0; i < n; ++i) {
scanf("%d",f + i);
a[i] = (f[i] < 0)?p:(-1.e6);
}
double answer = -1.e6;
int num;
for (int i = 0; i < n; ++i) {
double may = get(i);
if (may >= answer + eps) {
answer = may;
num = 1;
}
else if ((may + eps > answer) && (may < answer + eps)) {
++num;
}
}
printf("%.2lf %d\n", answer, num);
return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1090



