UVA12186 树形DP

来源:互联网 发布:ubuntu tensorflow安装 编辑:程序博客网 时间:2024/06/05 04:31

题意

一个公司有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;}
0 0
原创粉丝点击