描述:
略
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX = 100010;
int T;
vector<int> sub[MAX];//某个员工的直接下属
int dp(int p){
if(sub[p].empty())//平民
return 1;
int n = sub[p].size();
vector<int> d;
for(int i = 0;i < n; ++i)
d.push_back(dp(sub[p][i]));
int k = (n * T - 1) / 100 + 1;//神奇的向上取整方式。
sort(d.begin(),d.end());
int sum = 0;
for(int i = 0;i < k; ++i)
sum += d[i];
return sum;
}
int main(){
int n,i,boss;
while(scanf("%d%d",&n,&T)){
if(n == 0 && T == 0)
break;
for(i = 0;i <= n; ++i)
sub[i].clear();
for(i = 1;i <= n; ++i){
scanf("%d",&boss);
sub[boss].push_back(i);
}
printf("%d\n",dp(0));
}
return 0;
}
代码来自紫书,为啥把这也归为dp。