此题属于树形dp中最简单的一类题目,dp思想所用甚少。
#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn=100000 ;
int n,T;
vector<int >G[maxn+10];
int dp[maxn+10];
void init()
{
for0(i,n+1)
{
G[i].clear();
}
}
bool cmp(int x,int y)
{
return dp[x]<dp[y];
}
void dfs(int x,int fa)
{
int m=G[x].size();
if(!m)
{
dp[x]=1;return;
}
int k=ceil(1.0*m*T/100);
// cout<<x<<" "<<k<<endl;
for(int i=0;i<G[x].size();i++)
{
int y=G[x][i];
if(y==fa) continue;
dfs(y,x);
}
sort(all(G[x]),cmp);
dp[x]=0;
for0(i,k)
{
dp[x]+=dp[G[x][i] ];
}
}
int main()
{
while(~scanf("%d%d",&n,&T)&&(n||T) )
{
int fa;
init();
for1(i,n)
{
scanf("%d",&fa);
G[fa].push_back(i);
}
dfs(0,-1);
printf("%d\n",dp[0]);
}
return 0;
}