UVa - 12186 - Another Crisis ( 树形DP )




题目大意:在公司里面,有一个大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[N];
int dp[N];
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值