##Description
一场新的money上crisis爆发了,这场crisis使得很多人陷入的money的困境。一些X公司的员工试图通过要求加薪度过这一难关。
X公司有着严格的等级制度,除了公司所有者小H以外,其他人都有一个直属上司。没有下属的员工称为工人,其他人则称为领导者。
为了加薪,工人们都会向他们的上司提交请愿书。当然,每个领导者都希望自己的下属能够尽可能快乐的工作,所以当至少有T%的下属提交请愿书时,那么这个领导者就会向自己的上司提交请愿书。计算百分比时,领导者只会计算直属上司是他的下属,当然,他也只会提交一次请愿书。
如果最会小H收到了超过T%的请愿书,那么他将为所有工人们加薪。现在给出公司的构架和T的数值,你需要计算至少有多少工人提交请愿书才能使得小H给工人加薪。
##Solution
这不就是一道贪心题吗!
处理出每个点能通过申请的最小需要工人数。
那么每个点,就把所有的儿子的最小需要工人数排一个序,然后贪心处理。
因为每个点只会被处理一次,所以排序的总时间复杂度是【NOIP模拟】Crisis_排序的。
##Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define rep(i,a) for(i=first[a];i;i=next[i])
using namespace std;
const int maxn=100007;
int i,j,k,l,n,m,ans;
int first[maxn*2],last[maxn*2],next[maxn*2],f[maxn*2],num,size[maxn*2],data[maxn];
double pan,d,t;
void add(int x,int y){
last[++num]=y;next[num]=first[x];first[x]=num;
}
void dfs(int x){
int i;
if(!first[x]){
f[x]=1;
return;
}
rep(i,x){
dfs(last[i]);
}
j=k=0;
rep(i,x)data[++j]=f[last[i]];
sort(data+1,data+1+j);
fo(i,1,j){
d=(i-1)/(size[x]*1.0);
if(d>=pan){
f[x]=k;
return;
}
k+=data[i];
}
d=j/(size[x]*1.0);
if(d>=pan){
f[x]=k;
return;
}
}
int main(){
scanf("%d%lf",&n,&t);
pan=t/100;
fo(i,1,n){
scanf("%d",&k);
size[k]++;
add(k,i);
}
dfs(0);
printf("%d",f[0]);
}