UVA 12186 Another Crisis 樹形DP
阿新 • • 發佈:2018-12-19
題意:
給定一個樹形關係圖,父節點是子節點得上級,根節點是BOSS,要想給BOSS提意見,直接下級提意見數不小於T%,問最少要多少工人(葉節點)題問
分析:
dp(u)表示讓u給上級發信最少需要多少工人 設u有k個兒子節點。 那麼dp(u)=(k*T-1)/100+1
/* dp(u)表示讓u給上級發信最少需要多少工人 設u有k個兒子節點。 那麼dp(u)=(k*T-1)/100+1 */ #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int n,t; vector<int> g[maxn]; int dfs(int u){ int k=g[u].size(); if(k==0) return 1; vector<int> d; for(int i=0;i<k;i++){ d.push_back(dfs(g[u][i])); } sort(d.begin(),d.end()); int ans=0; int c=(k*t-1)/100+1; for(int i=0;i<c;i++){ ans+=d[i]; } return ans; } int main(){ while(scanf("%d%d",&n,&t)&&(n||t)){ for(int i=0;i<=n;i++){ g[i].clear(); } for(int i=1;i<=n;i++){ int u; scanf("%d",&u); g[u].push_back(i); } printf("%d\n",dfs(0)); } return 0; }