分析
用C写这个 第一个想法是建一个child[1e5+2][1e5+2],感觉有点大 系统会崩,而且还得额外再建一个num[1e5+2]存储每个节点孩子数量,于是改用C++超棒的vector
vector常用函数
- 简单定义 vector<int>obj[1005];
- push_back(int x);尾部增加一个数
- pop_back();尾部删除一个数
- size();返回实际大小
- begin();返回一个指针,指向头部(常见于排序函数)
- end();返回一个指针,指向尾部地址+1
- front();返回一个数,头部
- back();返回一个数,尾部
- at(int pos);返回这个位置上的数,也可以用obj[pos]
- 排序 sort(obj.begin(),obj.end());//从小到大 reverse(obj.begin(),obj.end());//从大到小
- C排序用qsort()
万能头文件
#include<bits/stdc++.h>在C++中一个顶万个,写一个头文件包含所有常用头文件
这道题类似1079 Total Sales of Supply Chain,只是求得东西不一样(瞬间投奔C++)
代码
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
vector<int>child[MAX];
int num=0,maxn=0;
void dfs(int v,int h){
// printf("%d %d\n",v,child[v].size());
if(child[v].size()==0){
if(h>maxn){
maxn=h;num=1;
}else if(h==maxn) num++;
return;
}
for(int i=0;i<child[v].size();i++){
dfs(child[v][i],h+1);
}
}
int main(){
int n,k,m,root;
double price,rate;
scanf("%d %lf %lf",&n,&price,&rate);
for(int i=0;i<n;i++){
scanf("%d",&m);
if(m==-1) root=i;
else child[m].push_back(i);
}
dfs(root,0);
rate=1+rate/100;
printf("%.2lf %d",price*pow(rate,maxn),num);
return 0;
}