博客
关于我
CF 1436D Bandit in a City 树上贪心
阅读量:622 次
发布时间:2019-03-14

本文共 1947 字,大约阅读时间需要 6 分钟。

好的,现在我来详细解释一下这个问题是如何解决的。

首先,我们需要理解题意:给定一棵树形结构,每个点上都有一定的人数,人只能向叶子节点移动,问土匪最少能抓到多少人。这个问题实际上涉及到如何在遍历每一个节点时,将人数合理分配到下一层的叶子节点,从而使得土匪能抓到的最少最大值最小化。

解题思路

  • 问题分析每个节点的人数需要合理分配到它所有的叶子节点。这样,每个叶子节点的人数不会过于拥挤,从而土匪在选择任何一条路径时,都能抓到尽可能少的最大人数。

  • 递归方法我们可以使用递归的方法来计算每个节点如何分配人数。从叶子节点开始,计算各个祖先节点应该如何分配人数,使得每个子树的叶子节点的人数达到均衡。

  • 分配策略对于每个节点,其人数应该被分配到每个子树中的叶子节点,分配的方式是基于子树的叶子数量来决定的。这样,每个叶子节点得到的人数会均匀一些,从而土匪分配的人数能够被最小化。

  • 动态计算从叶子节点向上计算,每个节点要将自己的总人数分配给所有叶子节点所在的子树。这需要计算子树的大小,并根据子树的人数和叶子节点的数量来进行分配。

  • 详细解释

  • 递归函数设计

    • dfs(u) 为计算节点 u 的总人数。
    • sz[u] 表示节点 u 所在子树的总人数。
    • ans[u] 表示节点 u 的最优解决方案。
  • 递归过程

    • 如果节点 u 无子树(即叶子节点),则 sz[u] = 1ans[u] = a[u](即该节点自身的人数)。
    • 对于内部节点,调用 dfs(v) 对于所有子节点 v,然后累加 szans
    • 计算分配策略:将当前节点的总人数分配到每个 v 子树中的叶子节点,使得每个叶子节点的 ans[v] 达到最大值。
  • 分配计算

    • 对于每个节点 u,计算其每个子树节点 v 的总人数 sz[v]
    • 计算每个子树的贡献,即 ans[v]
    • 统计每个子树 v 的叶子数量 outs
    • 计算当前节点的最优解:floor(current / outs)current % outs 中的最大值。
  • 所用数据结构

    • g[u] 用于存储节点 u 的所有子树。
    • a[u] 表示节点 u 的初始人数。
    • sz[u]ans[u] 分别用于划分子树人数和计算最优抓取数量。

    代码实现

    #include 
    using namespace std;void dfs(int u) { if (g[u].empty()) { sz[u] = 1; ans[u] = a[u]; return; } sz[u] = 1; ans[u] = 0; for (int v : g[u]) { dfs(v); sz[u] += sz[v]; ans[u] += ans[v]; }}void count(int u) { int outs = 0; ll total = ans[u]; for (int v : g[u]) { if (sz[v] == 1) { outs++; } count(v); } if (outs == 0) { return; } res = max(res, (total / outs) + (total % outs ? 1 : 0));}void solve() { int n; cin >> n; for (int i = 2; i <= n; i++) { int x; cin >> x; g[x].push_back(i); } for (int i = 1; i <= n; i++) { cin >> a[i]; } dfs(1); count(1); cout << res << endl;}int main() { ios_base::sync_with_stdio(false); cin.tie(0); solve(); return 0;}

    总结

    通过递归的方法,我们从叶子节点开始计算每个节点的最优抓取方案,从而实现分配人数的最优化,这样土匪在根节点能够抓到最少的最大人数。代码中 dfs 函数计算每个节点的子树人数和最优解,count 函数则从根节点对所有可能的路径进行统计,最终得到 res,即土匪最少能抓到的最多人数。这个方法确保了计算的效率和正确性,能够处理大规模的树结构问题。

    转载地址:http://qlcoz.baihongyu.com/

    你可能感兴趣的文章
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>
    OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
    查看>>
    OSPF技术连载17:优化OSPF网络性能利器——被动接口!
    查看>>
    OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
    查看>>
    OSPF技术连载19:深入解析OSPF特殊区域
    查看>>
    SQL Server 复制 订阅与发布
    查看>>
    OSPF技术连载20:OSPF 十大LSA类型,太详细了!
    查看>>
    OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
    查看>>
    OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
    查看>>
    OSPF技术连载2:OSPF工作原理、建立邻接关系、路由计算
    查看>>
    OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
    查看>>
    OSPF技术连载6:OSPF 多区域,近7000字,非常详细!
    查看>>
    OSPF技术连载7:什么是OSPF带宽?OSPF带宽参考值多少?
    查看>>
    OSPF技术连载8:OSPF认证:明文认证、MD5认证和SHA-HMAC验证
    查看>>