题目地址
代码A:
#include <iostream>
#include<stdio.h>
#include<math.h>
#define MAX 100001
using namespace std;
int relative[MAX];
double curPrice[MAX],rate;
float basePrice,eps = 1.e-8;
double fun(int i)
{
if(curPrice[i]>=basePrice)
return curPrice[i];
else return curPrice[i]=fun(relative[i])*(1+rate);
}
int main()
{
int n;
scanf("%d%f%lf",&n,&basePrice,&rate);
rate/=100;
for(int i=0;i<n;i++)
{
scanf("%d",&relative[i]);
curPrice[i]=relative[i]<0?basePrice:-1;
}
double highPrice=-10000;
int change=0;
for(int i=0;i<n;i++)
{
curPrice[i]=fun(i);
if (curPrice[i] >= highPrice + eps) {
highPrice= curPrice[i];
change = 1;
}
else if ((curPrice[i] + eps > highPrice) && (curPrice[i] <highPrice + eps)) {
change++;
}
}
printf("%0.2lf %d",highPrice,change);
return 0;
}
代码B:
#include <iostream>
#include<stdio.h>
#include<math.h>
#define MAX 100001
using namespace std;
int relative[MAX];
float curPrice[MAX];
int main()
{
int n;
float basePrice,rate;
scanf("%d%f%f",&n,&basePrice,&rate);
rate/=100;
for(int i=0;i<n;i++)
{
scanf("%d",&relative[i]);
curPrice[i]=relative[i]<0?basePrice:0;
}
double highPrice=0;
int num=0;
int change=0;
for(int i=0;i<n;i++)
{
int x=i;
while(relative[x]!=-1)
{
x=relative[x];
num++;
}
curPrice[i]=basePrice*pow(1+rate,num);
num=0;
if(highPrice<curPrice[i])
{
highPrice=curPrice[i];
change=1;
}
else if(highPrice==curPrice[i])
{
change++;
}
}
printf("%0.2lf %d",highPrice,change);
return 0;
}
代码A可以在PAT和牛客网上通过所有案例,而代码B只可以通过牛客网上案例,在PAT上超时。刚开始的时候以为是pow函数耗时太长,更改之后,仍然超时。分析后发现代码B在计算每一个节点的时候,都会从根节点开始计算。当节点数很多的时候,耗时会成倍增加,所以更改为递归函数,每次都是以父节点为基准计算当前值。这样大大减少了计算时间,通过所有案例。另外,在判断double类型是否相等时要注意精度的控制(1e-8),输入时用“%lf”。