pat 甲級 1090(bfs遍歷)
阿新 • • 發佈:2018-11-18
題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805376476626944
思路:一開始用的bfs求每一次的利潤,後來就是有好多點過不去,參考了網上的做法,可以先算出
樹的深度,然後求根據深度求出最大結果。
注意:(1)mx的初始值很重要,我一開始設為-1,後來發現有一個點過不去,是因為如果樹的深度是1,
就會出錯,所以設為0就對了。
(2)不一定要一次求出結果,可以通過深度求出結果。
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<cmath> using namespace std; const int maxn = 100010; int a[maxn],vis[maxn],n; vector <int> vc[maxn]; int main(void) { int i,j,x,st,tp; double p,r; scanf("%d%lf%lf",&n,&p,&r); for(i=0;i<n;i++) { scanf("%d",&x); if(x!=-1) vc[x].push_back(i); else st=i; } int mx=0,num=0; memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); queue <int> q; q.push(st); while(!q.empty()) { tp=q.front(); q.pop(); for(i=0;i<vc[tp].size();i++) { a[vc[tp][i]]=a[tp]+1; //if(mx==a[vc[tp][i]]) num++; if(mx<a[vc[tp][i]]) mx=a[vc[tp][i]];//num=1; q.push(vc[tp][i]); } } for(i=0;i<n;i++) if(mx==a[i]) num++; double ans=p; r=(1+r/100); for(i=0;i<mx;i++) ans*=r; printf("%.2lf %d\n",ans,num); return 0; }