您的位置:首页 > 其它

uva 12186 lrj-P282 简单树形dp

2017-09-06 22:25 399 查看
题意:

某个人签字的话,他的直属下属里必须有至少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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: