Pro

GAS gastask

给出一个n个节点的树,现在要在这棵树上放置一些指示物:

1.       一个节点可以放置多个指示物;

2.       一个指示物拥有一个笼罩范围,即与它本身所在节点的距离在k个节点之内的任何节点,它都可以选择笼罩

3.       每个指示物最多笼罩s个不同的节点。

问题是使用最少的指示物将整棵树全部笼罩到。

Solution

题目给出了一棵树,可以比较容易地得到对于一个节点,我们找到一个从它这里可以覆盖到的最远的子节点,那么从它到这个子节点的路径上的每一个节点设立指示物都可以覆盖到这个子节点,那么从当前的这个节点设立应该是最优的,这样有没有可能有反例呢?

我们假设这条路径中有某一个节点i的子树中有另一个节点j,这个节点是i可以到达而之前的那个祖先节点所无法到达的,那么这个时候就有可能出现在节点i设立指示物比在祖先节点设立更优的情况(想想就知道),这就出现了反例。

为了避免这种情况,我们可以每次找深度最大的一个叶子节点,然后再找离它最远的祖先节点作为覆盖它的节点,那么就可以保证这样的决策不会出现上面的反例。

由于最深的节点满足拓扑序,所以可以使用一个队列来维护,对于每一个节点查询覆盖节点。整个算法的复杂度为O(nk)。

不过这样实现起来比较麻烦,这里我学到了一个来自涛哥的方法:我们使用f[i][j]表示从i号节点向子树中深搜j步所能到达的节点个数,g[i][j]表示从i号向子树中深搜j步所能到达的节点现在设立的指示物还能覆盖多少节点(有点绕)。

我们先深度遍历每一个点,然后递归处理出每个点能覆盖它的子树的节点个数最大是多少,由于这样是最优的所以我们在这个节点设立相应的指示物来覆盖它们,同时更新还能覆盖的节点个数,然后我们还要更新覆盖点和被覆盖点都在当前节点子树中的情况,即跨立的情况,如果子树中有某一个节点可以到达子树中的另外一个点并且其当先设立的指示物还能继续覆盖点,那么就把这些点覆盖。这样深搜完之后,再在外面做一遍非最优的决策看还有什么没有被调整到的。

#include <stdio.h>
#include <memory.h>const int nmax = 100000, kmax = 20;int n, k, s, f[nmax + 18][kmax + 18], g[nmax + 18][kmax + 18];
int fst[nmax + 18], pnt[(nmax << 1)+ 18], nxt[(nmax << 1)+ 18], tot = 0, ans = 0;
bool ed[nmax + 18];void addedge (int s, int t)
{pnt[++tot] = t;nxt[tot] = fst[s];fst[s] = tot;pnt[++tot] = s;nxt[tot] = fst[t];fst[t] = tot;
}int top (int x)
{return x ? (x - 1) / s + 1 : 0;
}void adjust (int &a, int &b)
{if (a >= b) a -= b, b = 0;else b -= a, a = 0;
}void dfs (int i)
{ed[i] = true;for (int kk = fst[i], j = pnt[kk]; kk; kk = nxt[kk], j = pnt[kk])if (!ed[j]){dfs (j);for (int l = 1; l <= k; ++l){f[i][l] += f[j][l - 1];g[i][l] += g[j][l - 1];g[i][l] <?= n;}}ans += top (f[i][k]);f[i][0] = 1;g[i][0] = top (f[i][k]) * s;for (int j = k; j >= 0; --j){adjust (f[i][k - j], g[i][j]);if (j < k) adjust (f[i][k - j - 1], g[i][j]);}
}int main ()
{freopen ("gas.in", "r", stdin);freopen ("gas.out", "w", stdout);scanf ("%d%d%d", &n, &s, &k);for (int i = 1, s, t; i < n; ++i)scanf ("%d%d", &s, &t), addedge (s, t);dfs (1);for (int i = k; i >= 0; --i)for (int j = k - i; j >= 0; --j)adjust (f[1][j], g[1][i]);int S = 0;for (int i = 0; i <= k; ++i)S += f[1][i];printf ("%d", ans + top (S));return 0;
}

  

转载于:https://www.cnblogs.com/Neroysq/archive/2011/08/19/2145412.html

[POI 2009] gas 贪心相关推荐

  1. BZOJ1117 [POI2009]救火站Gas 贪心

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ1117.html 题目传送门 - BZOJ1117 题意 给你一棵树,现在要建立一些消防站,有以下要求: ...

  2. [POI 2009]Lyz

    Description 题库链接 初始时滑冰俱乐部有 \(1\) 到 \(n\) 号的溜冰鞋各 \(k\) 双.已知 \(x\) 号脚的人可以穿 \(x\) 到 \(x+d\) 的溜冰鞋.有 \(m\ ...

  3. 解题:POI 2009 Lyz

    题面 板板讲的霍尔定理 霍尔定理:一张二分图有完全匹配的充要条件是对于任$i$个左部点都有至少$i$个右部点与它们相邻.放在这个题里就是说显然最容易使得鞋不够的情况是一段连续的人,那就维护一下最大子段 ...

  4. 【BZOJ 1115】【POI 2009】石子游戏Kam

    http://www.lydsy.com/JudgeOnline/problem.php?id=1115 差分后变成阶梯博弈. #include<cstdio> #include<c ...

  5. UVA12321 Gas Stations【贪心】

    G gas stations are authorized to operate over a road of length L. Each gas station is able to sell f ...

  6. USACO 2009 FEB Fair Shuttle 庙会班车 贪心

    题目 题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the sh ...

  7. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  8. java excel读取操作,Java 操作 Excel (读取Excel2003 2007,Poi兑现)

    Java 操作 Excel (读取Excel2003 2007,Poi实现) 一. Apache POI 简介( http://poi.apache.org/) 使用Java程序读写Microsoft ...

  9. Paper之ACLEMNLP:2009年~2019年ACL计算语言学协会年会EMNLP自然语言处理的经验方法会议历年最佳论文简介及其解读

    Paper之ACL&EMNLP:2009年~2019年ACL计算语言学协会年会&EMNLP自然语言处理会的经验方法会议历年最佳论文简介及其解读 目录 ACL计算语言学协会年会& ...

最新文章

  1. 都在建议,不要直接使用 @Async 注解,为什么?
  2. 最新最全!阿里等宣布再次延迟复工,有您们公司嘛?
  3. bat no moudle named xxx
  4. Windows内核实验004 API调用
  5. 解析C/C++的预处理指令
  6. 云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)
  7. 伯克利2019深度学习课程—李沐及其亚马逊同事一起讲述(内附视频链接及PDF下载)
  8. PIE SDK波谱运算
  9. 举例在项目中动态构建自己的程序集,.NET产生动态程序集!
  10. 在用户控件中动态添加控件及事件
  11. 笔记本主板如何测试软件,笔记本硬件检测,小编教你笔记本怎么检测硬件
  12. STM32F103入门 | 2.STM32F103xx内部资源介绍
  13. 华为hicar支持车型列表_汽车大观| 华为的“汽车梦”
  14. 文本特征提取和向量化
  15. 正点原子Lora无线串口的透明传输点对点通信及其注意事项
  16. [WPF]Win10便签软件
  17. 惠而浦扫地机器人充不进电_惠而浦 扫地狗等扫地机器人清扫效果差
  18. 不改HOST,另类打开谷歌搜索的方法
  19. XML文件怎么添加注释
  20. 启动牛市的密钥藏宝计划(TPC),火热来袭!

热门文章

  1. React Bind Handle的思考
  2. PL/SQL复合变量
  3. 利用dom4j取出XML文件中的数据
  4. 一个简单的遮罩弹出层效果
  5. 让几个div靠外面容器底部对齐
  6. CCNA认证指南note 01
  7. Oracle中的date与timestamp
  8. 小码哥iOS学习笔记第八天: block的底层结构
  9. 程序员委托事件学习随笔
  10. WWDC 2018 New Localization Workflows