原文链接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. python学习第40天

    # 多表查询 # 索引的基础理论 + 数据准备

  2. js实现两种排序算法——冒泡、快速排序

    * 一:冒牌排序1思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置要实现上述规则需要用到两层for循环,外层从第一个数到倒数第二个数,内层从 ...

  3. maven install 报错 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    1.控制台打印信息 [INFO] Scanning for projects... [INFO] [INFO] ---------------------< org.cqupt.mauger:R ...

  4. Java 开源博客 Solo 2.5.0 发布

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

  5. Confluence 6 发送 Confluence 通知到其他 Confluence 服务器

    你可以配置 Confluence 服务器向其他的 Confluence 服务器发送消息.在这种情况下,Confluence 服务器将不会显示 workbox. 希望发送消息到其他 Confluence ...

  6. SpringMVC国际化与文件上传

    点击阅读上一章 其实SpringMVC中的页面国际化与上一章的验证国际化基本一致. 1.对页面进行国际化 1)首先我们对Spring配置文件中添加国际化bean配置 <!-- 注册国际化信息,必 ...

  7. angular基础巩固

    angular中的模块化 //定义模块 []为依赖的模块 moduleName可以使用[]模块中定义的controller filter .. var app=angular.module('modu ...

  8. 自己没有记住的一点小知识(ORM查询相关)

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  9. kali linux 更新问题

    1.使用一次更新和升级软件替换 apt-get install && apt -y full -upgrade 之后使用 reboot重启    系统,重启之后 再次使用命令   ap ...

  10. Brup Suite 渗透测试笔记(五)

    之前章节记到Burp Intruder功能区,接上次笔记 一.首先说再展开说说Brup Intruder功能, 1.标识符枚举Web应用程序经常使用标识符来引用用户账户,资产数据信息. 2.提取有用的 ...