PAT甲级真题Highest Price in Supply Chain(实质找树的深度)
- 典型思路递归深搜,超时了
#include<bits/stdc++.h>
using namespace std;
int dep;
int all_posi[1000000];
void find(vector<vector<int>>s,int r,int nowdepth){
if(s[r].size()==0){//叶子节点
dep=dep>nowdepth?dep:nowdepth;
all_posi[nowdepth]++;
return;
}
for(int i=0;i<s[r].size();i++){
find(s,s[r][i],nowdepth+1);
}
}
int main(){
int n;
double p,r;cin>>n>>p>>r;
vector<vector<int>>supply(n);
int temp;int root=-1;
for(int i=0;i<n;i++){
cin>>temp;
if(temp!=-1){
supply[temp].push_back(i);
}else{
root=i;
}
}
find(supply,root,0);
for(int i=0;i<dep;i++)
p=p*(1+r/100);
printf("%.02f",p);
cout<<" "<<all_posi[dep];
}
- 改进思路,直接标记一个节点是叶子节点还是分支节点,然后直接遍历叶子节点往上找直至根节点,再选出最大数字
#include<bits/stdc++.h>
using namespace std;
int dep;int root;
int all_posi[1000000];//记录每个节点的父亲是谁
int isleaf[1000000];//标记是不是叶子节点
int find(int r){
if(r==root)
return 0;
int temp=-1;
while(r!=root){
temp++;
r=all_posi[r];
}
return temp;
}
int main(){
int n;
double p,r;cin>>n>>p>>r;
int temp;
for(int i=0;i<n;i++){
cin>>temp;
all_posi[i]=temp;//输入每个节点父亲
if(temp!=-1)
isleaf[temp]=1;//temp序号的节点有孩子
else{
root=temp;//找到了根节点,根节点没有父亲不用去标记
}
}
//遍历寻找最大深度
int tempdep;
for(int i=0;i<n;i++){
if(!isleaf[i]){
tempdep=find(i);
dep=dep>tempdep?dep:tempdep;
}
}
int counter=0;
for(int i=0;i<n;i++){
if(!isleaf[i]){
tempdep=find(i);
if(dep==tempdep)counter++;
}
}
for(int i=0;i<dep;i++)
p=p*(1+r/100);
printf("%.02f",p);
cout<<" "<<counter;
}
顺利通过!