题意:
某个人签字的话,他的直属下属里必须有至少T%的人签字,问让老板签字最少需要多少工人签字
题解:
树形dp
以老板为根节点,从小往上,递归计算答案即可
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 100005
int a,n,T;
vector<int>sons[maxn];
int dfs(int u)
{
if(sons[u].empty()) return 1;
int k=sons[u].size();
vector<int>dp;
for(int i=0;i<k;i++)
dp.push_back(dfs(sons[u][i]));
sort(dp.begin(),dp.end());
int c=(k*T-1)/100.0+1,ans=0;
for(int i=0;i<c;i++)
ans+=dp[i];
return ans;
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&T),n+T!=0)
{
for(int i=0;i<=n;i++) sons[i].clear();
for(int i=1;i<=n;i++)
scanf("%d",&a),sons[a].push_back(i);
int ans=dfs(0);
printf("%d\n",ans);
}
return 0;
}