原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ1117.html

题目传送门 - BZOJ1117

题意

  给你一棵树,现在要建立一些消防站,有以下要求:

    1. 消防站要建立在节点上,每个节点可能建立不只一个消防站。

    2. 每个节点应该被一个消防站管理,这个消防站不一定建立在该节点上。

    3. 每个消防站可以管理至多s个节点。

    4. 消防站只能管理距离(两点间最短路径的边数)不超过k的结点。

  请问至少要设立多少个消防站。

题解

  考虑贪心从下往上走。

  设 rem[x][i] 表示 x 的子树中与 x 的距离为 i 的未决策节点总数。

  设 foc[x][i] 表示 x 的子树中与 x 的距离为 i 的灭火器还能管辖多少节点。

  贪心策略就是尽量把灭火器往祖先上应用。

  分两个情况再描述一下:

  1. 对于 rem[x][k] 这一部分,我们需要在节点 x 新增灭火器。

  2. i 从小到大检验 foc[x][i] ,如果它可以灭 rem[x][i] 或者 rem[x][i-1] ,那么必然灭了最好,否则到上面了就灭不了了;就算别的灭火器灭了它,我们只需要交换这两个灭火器的消灭对象就可以打到至少不劣的效果。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005,K=25;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
struct Graph{
static const int M=N*2;
int cnt,y[M],nxt[M],fst[N];
void clear(){
cnt=1;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,s,k;
LL rem[N][K],foc[N][K];
int ans=0;
void solve(int x,int pre){
rem[x][0]++;
for (int i=g.fst[x];i;i=g.nxt[i])
if (g.y[i]!=pre){
int y=g.y[i];
solve(y,x);
for (int j=0;j<k;j++){
rem[x][j+1]+=rem[y][j];
foc[x][j]+=foc[y][j+1];
}
}
int d=(rem[x][k]+s-1)/s;
ans+=d;
foc[x][k]+=d*s;
for (int i=0;i<=k;i++)
for (int j=i;foc[x][i]&&j>=0&&(j>=i-1||x==1);j--){
d=min(foc[x][i],rem[x][j]);
foc[x][i]-=d;
rem[x][j]-=d;
}
}
int main(){
n=read(),s=read(),k=read();
g.clear();
for (int i=1;i<n;i++){
int a=read(),b=read();
g.add(a,b);
g.add(b,a);
}
solve(1,0);
int t=0;
for (int i=0;i<=k;i++)
t+=rem[1][i];
printf("%d\n",ans+(t+s-1)/s);
return 0;
}

  

BZOJ1117 [POI2009]救火站Gas 贪心的更多相关文章

  1. [POI2009]救火站Gas

    Description 给你一棵树,现在要建立一些消防站,有以下要求: 1. 消防站要建立在节点上,每个节点可能建立不只一个消防站. 2. 每个节点应该被一个消防站管理,这个消防站不一定建立在该节点上 ...

  2. [BZOJ1117]救火站gas

    Description 给你一棵树,现在要建立一些消防站,有以下要求: 1. 消防站要建立在节点上,每个节点可能建立不只一个消防站. 2. 每个节点应该被一个消防站管理,这个消防站不一定建立在该节点上 ...

  3. nyoj 710 外星人的供给站【贪心区间选点】

    外星人的供给站 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命 ...

  4. NYOJ710 外星人的供给站 【贪心】

    外星人的供给站 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们眼下对生命基 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. NOIP树上问题总结

    这几年考了好几次树上问题: NOIP2012 疫情控制(二分答案+倍增+贪心) NOIP2013 货车运输(最大生成树+倍增) NOIP2014 联合权值(勉强算作树形dp的傻逼题) NOIP2015 ...

  7. [蓝桥杯]ALGO-15.算法训练_旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  8. 【自编教材】16万8千字的HTML+CSS基础 适合从0到1-可收藏

    [图片链接有点小问题,这几天更新,敬请期待!] 目 录 第一章HTML基础 1.1 HTML简介和发展史 1.1.1 什么是HTML 1.1.2 HTML的发展历程 1.1.3 web标准 1.2 开 ...

  9. Gas Station|leetcode 贪心

    贪心:尽量将gas[i]-cost[i]>0的放在前面,gas[i]-cost[i]<0的放在后面.(路程的前面有汽油剩下,耗汽油的放在路程的后面). 能否全程通过的 条件 是:sum(g ...

随机推荐

  1. 压缩JS的eclipse插件

    主页:http://jscompressor.oncereply.me/ Update site: http://jscompressor.oncereply.me/update/

  2. eclipse的工程中如何查找字符串

    ctrl + h 后弹出 tab选项, 你选择 file search 然后在下面输入要查找的字符串 workset 那里选择你要查找的项目 默认是全部项目进行查找

  3. Codeforces 1110D Jongmah [DP]

    洛谷 Codeforces 我-我我把这-这这题切了??? 说实话这题的确不难,只是我看到有大佬没做出来有点慌-- 突然发现这题是我在洛谷的第500个AC呢.那就更要写篇题解纪念一下了. 思路 容易想 ...

  4. numpy函数:[1]shape用法

    shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入参数可以使一个整数表示维度,也可以是一个矩阵.

  5. Java 开源博客 Solo 2.5.0 发布

    Java 开源博客 Solo 2.5.0 发布 Solo 是一款一个命令就能搭建好的 Java 开源博客系统,如果你想开个独立博客,请一定不要错过! 2.5.0 版本主要支持了 Markdown/JS ...

  6. Confluence 6 workbox 的位置

    Confluence 6 workbox 的位置在首页什么地方? workbox 应该在页面顶部的用户登录后的地方. https://www.cwiki.us/display/CONFLUENCEWI ...

  7. 声明寄存器ROM

    :] ROM [:] ; integer i; initial begin ;i<=;i=i+) begin ROM[i] <= {{'b0}}; end end 同时可以考虑双端口ROM ...

  8. java多线程快速入门(二十)

    1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...

  9. cf869C组合计数问题

    如果在两个区域里连点,两个区域内选的点数一定要相等 即a中选出i个点,必须与b中选出i个点相连 连接种类数为  然后我们再来看,如果ab中有两点相连,其中一点再与c相连会出事吗? 很显然不会对答案产生 ...

  10. hdu3949 异或空间 + 求矩阵的主元

    给定n个整数,将数分解成01序列,由这n个01序列构成矩阵,这n个数构成线性空间,这就是异或空间 将这个矩阵高斯消元,求出t个主元,那么由着t个主元构成的线性空间里总共有2^t个数 设这t个数分别是a ...