题目链接

版本1

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
vector<int> v[maxn],u;
int maxN=0;
double t=0;
void dfs(int r,double p, double c){
	
	if(v[r].size()==0 ){
		if(p > t){
			t = p;
			maxN=0;
		}
		if(p==t) maxN++;
		return;
	}
	p = p * (1 + c/100.0); 
	for(int i=0;i<v[r].size();i++){
		int j = v[r][i];
		dfs(j,p,c);
	}
}
int main(){
	int n,k,num,tmp,root;
	double price,inc;
	cin>>n>>price>>inc;
	for(int i=0;i<n;i++){
		cin>>tmp;
		if(tmp==-1){ //根 
			root=i;
		}else{
			v[tmp].push_back(i);
		}
	}
	dfs(root,price,inc);
	
	printf("%.2f %d\n",t,maxN);
	return 0;
} 

版本2

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
vector<int> v[maxn],u;
int maxN=0,maxDepth=0;
void dfs(int r, int depth){
	if(v[r].size()==0 ){
		if(depth > maxDepth){
			maxDepth=depth;
			maxN=1;
		}
		else if(maxDepth==depth) maxN++;
		return;
	} 
	for(int i=0;i<v[r].size();i++){
		int j = v[r][i];
		dfs(j, depth+1);
	}
}
int main(){
	int n,tmp,root;
	double price,inc;
	cin>>n>>price>>inc;
	for(int i=0;i<n;i++){
		cin>>tmp;
		if(tmp==-1){ //根 
			root=i;
		}else{
			v[tmp].push_back(i);
		}
	}
	dfs(root, 0);
	printf("%.2f %d\n",price*pow(1+inc/100, maxDepth),maxN);
	return 0;
}