遊歷魔法王國_2018網易校招
阿新 • • 發佈:2018-12-24
遊歷魔法王國
小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的一個城市,小易最多能行動L次。
如果小易到達過某個城市就視為小易遊歷過這個城市了,小易現在要制定好的旅遊計劃使他能遊歷最多的城市,請你幫他計算一下他最多能遊歷過多少個城市(注意0號城市已經遊歷了,遊歷過的城市不重複計算)。
時間限制:1秒
空間限制:32768K
魔法王國一共有n個城市,編號為0~n-1號,n個城市之間的道路連線起來恰好構成一棵樹。小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的一個城市,小易最多能行動L次。
如果小易到達過某個城市就視為小易遊歷過這個城市了,小易現在要制定好的旅遊計劃使他能遊歷最多的城市,請你幫他計算一下他最多能遊歷過多少個城市(注意0號城市已經遊歷了,遊歷過的城市不重複計算)。
輸入描述:
輸入包括兩行,第一行包括兩個正整數n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市個數和小易能行動的次數。 第二行包括n-1個整數parent[i](0 ≤ parent[i] ≤ i), 對於每個合法的i(0 ≤ i ≤ n - 2),在(i+1)號城市和parent[i]間有一條道路連線。
輸出描述:
輸出一個整數,表示小易最多能遊歷的城市數量。
輸入例子1:
5 2 0 1 2 3
輸出例子1:
3
#include <iostream> #include <algorithm> #include <stdio.h> #include <vector> using namespace std; void traversal(int n,int L,vector<int> &parent) { int maxlen=0; vector<int>dp(n); for(int i=0;i<n-1;i++) { dp[i+1]=dp[parent[i]]+1; maxlen=max(maxlen,dp[i+1]); } int ans=min(maxlen,L); cout<<min(n,1+ans+(L-ans)/2); } int main() { int n,L; cin>>n>>L; vector<int>parent; int x; for(int i=0;i<n-1;i++) { cin>>x; parent.push_back(x); } traversal(n,L,parent); }