UVA 12186 Another Crisis(树形DP)
2017-08-23 09:43
369 查看
UVA 12186 Another Crisis
知识
floor() 函数向下取整ceil() 函数向上取整
fix() 函数向0取整
round() 四舍五入取整
题意
工人的请愿书.老板编号为0 , 员工编号1~n. 工人要提交一份请愿书给老板.
每个人都不能跨级递交,只能给直属上司.
每个中级员工的直属下属中不小于T%的工人签字时,他才把请愿书给他的直属上司
问: 现在想让老板看到请愿书,最少要多少工人签字
解决
设 dp[u]表示让u发给上级请愿书,最少需要的工人数量.把u的所有子节点的dp值算出来 , 从小到大排序,选择出最小的几个(根据T计算)
注意向上取整…
int N,T; vector<int> sons[maxn]; int dp(int u) { if(sons[u].empty()) return 1; int len=sons[u].size(); vector<int> son_dp; //用于保存子节点的dp值 for(int i=0;i<len;i++){ son_dp.push_back(dp(sons[u][i])); } sort(son_dp.begin(),son_dp.end()); //排序后选取出dp值最小的几个 int nums = ceil( (double)len * T / 100.0); //de(len);de(T);de(nums); int ans = 0; for(int i=0;i<nums;i++) ans += son_dp[i]; return ans; } int main() { while(1) { int fa; scanf("%d%d",&N,&T); if(!N&&!T) return 0; for(int i=0;i<=N;i++) sons[i].clear(); for(int i=1;i<=N;i++){ scanf("%d",&fa); sons[fa].push_back(i); } printf("%d\n",dp(0)); } }
相关文章推荐
- UVA 12186 Another Crisis(树形DP)
- UVA 12186 Another Crisis [树形dp]
- UVa 12186 Another Crisis(树形DP)
- UVA - 12186 Another Crisis (树形dp)
- UVA - 12186 Another Crisis (树形dp)
- 【树形DP】UVa 12186 Another Crisis
- UVA 12186 - Another Crisis(树形DP)
- uva 12186 Another Crisis 树形dp
- UVA12186--- Another Crisis (树形dp)
- UVa 12186 - Another Crisis(树形DP)
- UVA - 12186 Another Crisis (树形DP)
- 树形dp uva 12186 Another Crisis
- UVA 12186 Another Crisis 树形DP
- UVa - 12186 - Another Crisis ( 树形DP )
- Another Crisis - UVa 12186 树形dp
- UVa 12186 - Another Crisis(树形DP)
- UVA-12186 Another Crisis 树形dp
- UVa 12186 工人的请愿书(树形DP)
- UVa-12186 Another Crisis (dp)
- UVa 12186 Another Crisis (DP)