运行超时的原因是:
当该树是一条链表的时候,当末端有很多叶子节点的时候,通过叶子找父亲,就需要找好多次
解决方法:
(1)开辟一个数组,用于存放该节点到根节点(包括叶子节点和根节点的个数),当该数组的值有意义的时候,直接拿来用。采用递归的方式来对该数组进行更新。
(2)采用根节点到叶子节点的dfs
两种方法的代码如下:
//第一种方法
#include<bits/stdc++.h>
using namespace std;
int pare[100000] = {-1};
bool vis[100000] = {false};
int countnum[100000] = {-1};
int n;
double m ,r;
int Find(int i){
if(i == -1)
return 0;
else{
int tem;
if(countnum[i]!=-1){
return countnum[i];
}else{
tem = Find(pare[i]);
tem++;
countnum[i] = tem;
return tem;
}
}
}
int main(){
fill(countnum,countnum+100000,-1);
cin>>n>>m>>r;
for(int i = 0 ; i < n ; i++){
int p;
cin>>p;
vis[p] = true;
pare[i] = p;
}
double max = 0.0;
int index = 0;
for(int i = 0 ; i < n ; i++){
if(!vis[i]){
int count = 0;
count = Find(i);
double temtotal = m*pow((1+r/100),count-1);
if(temtotal>max){
max = temtotal;
index = 1;
}else if(temtotal == max){
index++;
}
}
}
printf("%0.2lf %d",max,index);
}
//第二种方法
#include<bits/stdc++.h>
using namespace std;
int n;
double p,r;
vector<int> tree[100000];
double maxprice = 0.0;
int num = 0;
void DFS(int root,int deep){
if(tree[root].empty()){
double temprice = p*pow((1+r/100),deep-1);
if(temprice > maxprice){
maxprice = temprice;
num = 1;
}else if(temprice == maxprice){
num++;
}
}
for(int i = 0 ; i < tree[root].size() ; i++){
DFS(tree[root][i],deep+1);
}
}
int main(){
int target;
cin>>n>>p>>r;
for(int i = 0 ; i < n ; i++){
int m;
cin>>m;
if(m != -1)
tree[m].push_back(i);
else
target = i;
}
DFS(target , 1);
printf("%0.2f %d",maxprice,num);
}