P2018 消息传递[dp]】的更多相关文章

题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的上级,B也是A的上级. 最开始的时刻是0,你要做的就是用1单位的时间把一个消息告诉某一个人,让他们自行散布消息.在任意一个时间单位中,任何一个已经接到消息的人,都可以把消息告诉他的一个直接上级或者直接下属. 现在,你想知道: 1.到底需要多长时间,消息才能传遍整个巴蜀国的所有人? 2.要使消息在传递过程中消耗的时间最短,…
P2018 消息传递 题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的上级,B也是A的上级. 最开始的时刻是0,你要做的就是用1单位的时间把一个消息告诉某一个人,让他们自行散布消息.在任意一个时间单位中,任何一个已经接到消息的人,都可以把消息告诉他的一个直接上级或者直接下属. 现在,你想知道: 1.到底需要多长时间,消息才能传遍整个巴蜀国的所有人? 2.要使消息在传递…
P2018 消息传递 题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的上级,B也是A的上级. 最开始的时刻是0,你要做的就是用1单位的时间把一个消息告诉某一个人,让他们自行散布消息.在任意一个时间单位中,任何一个已经接到消息的人,都可以把消息告诉他的一个直接上级或者直接下属. 现在,你想知道: 1.到底需要多长时间,消息才能传遍整个巴蜀国的所有人? 2.要使消息在传递…
二次联通门 : luogu P2018 消息传递 /* luogu P2018 消息传递 树形dp 原来用优先队列做了一下, T了俩点 MMP 去看正解.. 复杂度一样好不好.. 每次到达一个点,记录其子树中所有的dp值 优先向大的一边转移 */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #define INF 1e8 ; char Buf[BU…
传送门啦 这个树形dp就没那么简单了,运用了一下贪心的思想 不同的排序方法对应着不同的转移方程,如果我们用 $ f[x] = max(f[x] , b[i] +cnt - i + 1) $ 来进行转移就要从小往大排,才能使f[x]小,如果用 $ f[x] = max(f[x] , b[i] + i - 1) $ 来转移就要从大往小排序. 第一个转移方程:$ cnt- i $ 为还有多少个才能到它,然后+1是因为国王这个点信息需要1的时间.即他子树的大小+传递到他的时间+1(向下传递) 第二个转移…
题面 总体来说是一道从下往上的DP+贪心: 设f[i]表示将消息传给i,i的子树全部接收到所能消耗的最小时间: 那么对于i的所有亲儿子节点j,我们会贪心地先给f[j]大的人传递,然后次大..... 可以证明,这样的答案一定是最优的: 然后f[i]=max(f[i],f[j]+cnt); 总的时间复杂度是O(n^2logn),可过: 但是还可以进一步优化(窝太懒了所以没写) 换根法,可以一遍dfs(nlogn)就求出所有的答案: #include <bits/stdc++.h> #define…
题目分析 贪心+树形DP 本来还以为要大费周折地换根,然后发现 \(n\) 很小,可以直接 \(O(n^2\log n)\) 枚举. 枚举每个节点作为根,用 \(f_x\) 表示走完以 \(x\) 为根的子树花费的最小时间. 那么如何更新呢?这个时候就要用到贪心的思想了.假设我们现在已经知道了 \(x\) 的儿子个数 \(tot\) 以及所有儿子 \(to\) 的 \(f\) 值.那么 \(x\) 必定要把信息传给每一个儿子,所以要尽量早地把信息传给 \(f\) 值较大的儿子,因此要把所有儿子的…
传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失.因此,你希望只告诉一部分特殊员工,然后依靠员工之间传递消息,使得所有的特殊员工都能获得要传递的消息,同时使得损失最小.同时,你不关心要传递的消息是否经过了其它员工.求最小的损失. Constraint 补全右侧代码区中的int solve(int N, vector cost_e, vector e…
非常妙的树形DP:由于n很小,我们可以枚举每一个点作为第一个节点,计算其时间花费 那么问题就转化为对于给点节点求花费时间. 通过观察,显然我们会发现先传给花费时间多的人更加合算,因为这样可以最大限度的避免 一个人还在辛苦的传递信息,另一个人却悠闲的喝下午茶(雾)的局面 所以我们可以每次都记录下对于一个节点而言,它的所有子节点的时长, 并对其排序,排序后先传给耗时最多的人,但这样传递了之后,由于耗时最多的人最先被传递, 那么这个本应耗时最多的人就不一定还是耗时最多的人了,因此我们要分别计算所有子节…
贪心优先子树较多者. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c) for(register int a = (b); a >= (c);…