您的位置:首页 > 其它

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 dp 树形DP