uva 12186 lrj-P282 简单树形dp

来源:互联网 发布:命令与征服 将军 知乎 编辑:程序博客网 时间:2024/06/03 19:09

题意:

某个人签字的话,他的直属下属里必须有至少T%的人签字,问让老板签字最少需要多少工人签字

题解:

树形dp

以老板为根节点,从小往上,递归计算答案即可


#include<vector>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 100005int 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;}


原创粉丝点击