标签:PAT Chain temp Supply int find dep root 节点
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;
}
顺利通过!
标签:PAT,Chain,temp,Supply,int,find,dep,root,节点 来源: https://blog.csdn.net/Bernie_double/article/details/117968550
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。