题意
一个公司有1个老板和n个员工,n个员工中有普通员工和中级员工。现在进行一次投票,若中级员工管理的普通员工中有T%的人投票,则中级员工也投票并递交给上级员工。求最少需要多少个普通员工投票,投票才能到达老板处。
题解
基础的树形DP,设d[u]为员工u想要投票给上级员工,最少需要多少个下级员工投票。若d[u]有k个下级员工,则至少需要(k*t-1)/100+1个下级员工投票才行。将所有下级员工d值排序,求前(k*t-1)/100+1个d值之和即为该员工d值。最后求出d[0],即为本题答案。
注意事项
vector排序方法为sort(vector.begin(),vector.end())
代码
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
vector<int> son[100010];
int t;
int dp(int u){
if(son[u].empty()){
return 1;
}
vector<int> d;
int k=son[u].size();
for(int i=0;i<k;i++){
d.push_back(dp(son[u][i]));
}
sort(d.begin(),d.end());
int c=(t*k-1)/100+1;
int sum=0;
for(int i=0;i<c;i++){
sum+=d[i];
}
return sum;
}
int main()
{
int n;
while(scanf("%d%d",&n,&t)){
memset(son,0,sizeof(son));
if(n+t==0)
break;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
son[x].push_back(i);
}
int ans=dp(0);
printf("%d\n",ans);
}
return 0;
}