您的位置:首页 > 其它

UVa - 12186 - Another Crisis ( 树形DP )

2016-12-15 22:36 585 查看


题目大意:在公司里面,有一个大boss,有员工,和领导,除了大boss一个人只有一个直接的领导 ,员工不是任何人的领导。现在要求老板加薪,当大boss的直接手下超过T%的人都反映加工资的时候,大boss才会同意,同理,每个领导也是一样的;问,如果要让领导同意加工资的话,至少需要多少员工反映加薪问题。

题目思路:设dp[ u ] 是 让 u 给上级发信,至少需要多少员工,那么,把dp [ u ] = sum(dp[ j ]); ( j 是 u 的子节点)。

 

动态规划代码部分:

int dfs(int u){
if(sons[u].empty()) return 1;
int size = sons[u].size();

vector<int>d;
for(int i=0 ;i<size ;i++) d.push_back(dfs(sons[u][i]));

sort(d.begin(),d.end());

int cnt = (size*t-1)/100+1;
int ans = 0;
for(int i=0 ;i<cnt ;i++){
ans += d[i];
}
return ans;
}


AC代码:

#include<cstdio>
#include<vector>
#include<algorithm>
#define N 100001
using namespace std;

vector<int>sons
;
int dp
;
int n,t,a;
bool cmp(vector<int>a,vector<int>b){
return a.size()<b.size();
}

int dfs(int u){ if(sons[u].empty()) return 1; int size = sons[u].size(); vector<int>d; for(int i=0 ;i<size ;i++) d.push_back(dfs(sons[u][i])); sort(d.begin(),d.end()); int cnt = (size*t-1)/100+1; int ans = 0; for(int i=0 ;i<cnt ;i++){ ans += d[i]; } return ans; }

int main(){
while(scanf("%d%d",&n,&t)&&n&&t){

for(int i=1 ;i<=n ;i++){
scanf("%d",&a);
sons[a].push_back(i);
}

int ans = dfs(0);
printf("%d\n",ans);

for(int i=0 ;i<=n ;i++){
sons[i].clear();
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: