uva 12186——Another Crisis

来源:互联网 发布:淘宝差评对卖家重要吗 编辑:程序博客网 时间:2024/06/11 10:57

题意:公司里有n个员工,组成树状的结构,老板的编号为0,工人给直隶上司递请愿书,当人数总量超过T*0.01时,往上呈递,求解需要多少工人才能让老板看到请愿书。


思路:树形DP。dp(u)是u需要的呈递需要的最小的人数,那么需要c = (k*T - 1) / 100 + 1个直接下属呈递,所有子节点的前c个即为dp(u)。


code:

#include <bits/stdc++.h>using namespace std;#define ft(i,s,t) for (int i=s;i<=t;i++)#define frt(i,t,s) for (int i=t;i>=s;i--)#define cls(v,c) memset(v,c,sizeof(v))const int INF=0x3f3f3f3f;const int N=1e5+5;int n,t,x,d[N];vector<int>g[N];int dp(int u){    if (g[u].empty()) return 1;    int len=g[u].size();    vector<int>d;    ft(i,0,len-1) d.push_back(dp(g[u][i]));    sort(d.begin(),d.end());    int c=(len*t-1)/100+1;    int ans=0;    ft(i,0,c-1) ans+=d[i];    return ans;}int main(){    while (~scanf("%d %d",&n,&t),n+t)    {        ft(i,0,n) g[i].clear();        ft(i,1,n) scanf("%d",&x),g[x].push_back(i);        printf("%d\n",dp(0));    }}


0 0
原创粉丝点击