UVA - 12186 Another Crisis(工人的请愿书)(树形dp)

题意:某公司有1个老板和n(n<=105)个员工组成树状结构,除了老板之外每个员工都有唯一的直属上司。老板的编号为0,员工编号为1~n。无下属的员工(叶子)打算签署一项请愿书递给老板,但不能跨级递,只能递给直属上司。当一个中级员工(非叶子)的直属下属中不小于T%的人签字时,他也会签字并且递给他的直属上司。问:要让公司老板收到请愿书,至少需要多少个工人签字?

分析:

1、dfs(u)表示让u给上级发信最少需要多少个工人。

2、需要在u的孩子结点中选择不小于T%的人数,这些人所需的工人签字越少越好,所以需要排序。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 1e5 + 10;
const int MAXT = 10000 + 10;
using namespace std;
vector<int> v[MAXN];
int N, T;
int dfs(int cur){
    int len = v[cur].size();
    if(!len) return 1;
    vector<int> tmp;
    for(int i = 0; i < len; ++i){
        tmp.push_back(dfs(v[cur][i]));
    }
    sort(tmp.begin(), tmp.end());
    int cnt = (int)ceil(len * (double)T / 100);
    int ans = 0;
    for(int i = 0; i < cnt; ++i){
        ans += tmp[i];
    }
    return ans;
}
int main(){
    while(scanf("%d%d", &N, &T) == 2){
        if(!N && !T) return 0;
        for(int i = 0; i < MAXN; ++i) v[i].clear();
        for(int i = 1; i <= N; ++i){
            int x;
            scanf("%d", &x);
            v[x].push_back(i);
        }
        printf("%d\n", dfs(0));
    }
    return 0;
}

  

时间: 2024-10-25 07:04:57

UVA - 12186 Another Crisis(工人的请愿书)(树形dp)的相关文章

UVA 12186 Another Crisis

UVA 12186 Another Crisis:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=243&page=show_problem&problem=3338 题意:世界危机发生了,工人们请求加薪.一个老板和n个员工组成树状结构,每个员工都有自己的唯一上司,Boss的编号为0,员工1~n,工人们打算签署一个志愿书给老板,但无法跨级,当一个中级员工(非是工人的员

uva 12186 Another Crisis 树形dp

// uva 12186 Another Crisis 树形dp // // 对于一个节点u,有k个子节点,则至少有c = (k * T - 1) / 100 + 1才能 // 发信,即c / k >= T / 100,则 c 的值为 k * T /100,上取整变成上式 // 将所有的子节点d从小到大排序,取前c个就是d[u]的值 // 紫书上的一题,之前看了好久好久,觉得挺好的,然而一直没做,今天就来 // 体验体验,挺好的一题,注意一下,如果一个节点是叶节点,直接return 1就好 //

uva 1484 - Alice and Bob&#39;s Trip(树形dp)

题目链接:uva 1484 - Alice and Bob's Trip 题目大意:Alice和Bob小两口一起出去旅行,他们从0城市出发,Bob喜欢走比较远的路,因为他是个勤奋的好孩子,Alice喜欢走比较近的路,因为她是一个不勤奋的坏孩子,所以有了意见上的分歧,于是乎在出门前他们约法三章,要求说最后的距离值在[l,r]之间,并且由夫妻两轮流做决定,决定说下一个城市去哪里.现在给出n个城市,以及n-1条边,问说在不让Bob媳妇生气的情况下,Bob最远能走多远(不违反约定),如果无法做到不违反约

UVa 12186 Another Crisis (DP)

题意:有一个老板和n个员工,除了老板每个员工都有唯一的上司,老板编号为0,员工们为1-n,工人(没有下属的员工),要交一份请愿书, 但是不能跨级,当一个不是工人的员工接受到直系下属不少于T%的签字时,自己也会签字,并交给上级,问你最少有多少工人签字,才能让老板收到请愿书. 析:题意比较简单,也好理解,很明显是一个动态规划的题目,d(u)表示u给上级要发信至少需要多少工人签字.假设u有k个结点,那么至少要 c = (kT-1)/100 + 1个工人,然后把每个结点排序,找出最少的工人即可,挺简单的

UVA 12186 Another Crisis(树形DP)

A couple of years ago, a new world wide crisis started, leaving many people with economical problems. Some workers of a particular company are trying to ask for an increase in their salaries. The company has a strict hierarchy, in which each employee

例题9-12 工人的请愿书 UVa12186

1.题目描述:点击打开链接 2.解题思路:本题利用树状dp解决,不过其实也可以理解为用贪心法解决的.设d(u)表示u给上级发信最少需要的工人个数,假设u有k个子结点,那么根据题意,至少需要c=(k*T-1)/100+1个直属下属发信才行.而每个直属下属的工人数是di,那么这时只需要把di由小到大排序,然后把前c个相加就是d(u)了.最终的答案是d(0).由于需要排序,因此总的时间复杂度是O(N*logN).最后附上一篇带有大量宏定义的参考代码,真心给跪,第一次见这么多的宏定义,Orz. 3.代码

UVa 2038 - Strategic game(二分图最小顶点覆盖 or 树形DP)

Strategic game Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad. Now he has the following problem. He must defend a medieval city, the roads of wh

UVAOJ 12186 Another Crisis (树形DP)

题意: 给出一个树状关系图.公司里仅仅有一个老板编号为0,其它人员从1開始编号. 除了老板,每一个人都有一个直接上司,没有下属的员工成为工人. 工人们想写一份加工资的请愿书,仅仅有当不少于员工的全部下属的T%人递交请愿书后,该员工才会将请愿书递交给他的直接上级.输出能递交到老板处,最少须要多少工人写请愿书 思路: d(u)表示让u给上级发信最少须要多少个工人.如果u有k个子节点,则至少须要c = (k*T - 1) / 100 + 1 个直接下级发信给他才行. 把全部子节点的d从小到大排序,前c

uva 1220 - Party at Hali-Bula 【入门树形dp】

题目:uva 1220 - Party at Hali-Bula 题意:一个公司员工要举行聚会,要求任意一个人不能和他的直接上司同时到场,一个员工只有一个支系上司,现在求最多有多少人到场,并且方案是否唯一 分析:分析发现是要求一个树的最大独立集.这里可以用树形dp解决. 定义dp[x][0]:表示在 i 点不选 i 点的以 x 为子树的最大独立集 而dp[x][1] 表示x到场的最大独立集 定义f [x][0]:表示以x为根且x点不选的子树是否唯一 ,f[x][1]表示以x为根且x选的子树是否唯