原文链接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;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ1117.html

BZOJ1117 [POI2009]救火站Gas 贪心相关推荐

  1. [BZOJ1117]救火站gas

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

  2. 第六届河南省大学生程序设计竞赛—— 外星人的供给站 (贪心)

    710-外星人的供给站 内存限制:64MB 时间限制:1000ms 特判: No 题目描述: 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本 ...

  3. [POI 2009] gas 贪心

    Pro GAS gastask 给出一个n个节点的树,现在要在这棵树上放置一些指示物: 1.       一个节点可以放置多个指示物: 2.       一个指示物拥有一个笼罩范围,即与它本身所在节点 ...

  4. python和nltk自然语言处理 脚本之家_想要入门自然语言处理,资料贫瘠,英语不好,大神推荐斯坦福的真的是搞不定,迷迷茫茫,不知从何下手?...

    不清楚题主定义的"入门"具体是什么层次.我认知中的入门一个领域有两种:第一种,知道核心概念大概含义并能调用工具,知其然而不知其所以然,这是知和用层面的入门:第二种,扎实掌握领域涉及 ...

  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. 【2019icpc南京站网络赛 - F】Greedy Sequence(思维,贪心构造,STLset)

    题干: You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n ...

  7. ZOJ 3987 Numbers 2017CCPC秦皇岛站G题 大整数 二进制 贪心

    题目:https://cn.vjudge.net/problem/ZOJ-3987 题意:给出一个数n(不超过4000个十进制数字),将其分成m(不超过10的100次方)个数,要求这m个数的和等于n. ...

  8. P3493 [POI2009]WSP-Island(贪心,半平面交)

    题意:给出一个凸包(顺时针),然后初始化下,凸包上任意两点都是有路径的,现在给出m次被封锁的路径,求在不经过这些被封锁的路径(可以在交叉路口经过这个点),求从1号点到n号点的最路径. 思路:认真画个图 ...

  9. 2018ICPC焦作站 B - Ultraman vs. Aodzilla and Bodzilla(贪心)

    题意:怪兽A攻击力为a1,血量为h1,怪兽B攻击力为a2,血量为h2,奥特曼的第 i 秒的攻击力为 i,问在打死两个怪兽之前奥特曼受到的最小伤害,在伤害值最小的前提下求字典序最小的攻击顺序. 思路:受 ...

最新文章

  1. 机器学习——大数据与MapReduce
  2. 【响应式Web前端设计】CSS 定位详解
  3. rehat linux设置ip,RedhatHat配置IPv6地址
  4. Qt Assistant快速指南
  5. .NET实现SOA(1)
  6. kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中
  7. 大小端问题傻傻分不清?
  8. 多语言ASR?没有什么听不懂,15种语言我全都要
  9. 2015 上半年 JavaScript 使用统计数据
  10. Dell Inspiron 3443 BIOS升级问题解决
  11. 支付宝sdk——python-alipay-sdk
  12. 小程序谷歌统计 Google Analytics
  13. 自行车码表使用说明—SIGMA(西格玛) BC906
  14. 微信小程序 微信小程序地图搜索、地图搜索点点击出callout气泡标题说明
  15. 软件测试从入门到入职,自学规划真的很重要~
  16. 自有视频会议+第三方视频会议系统混合使用
  17. 从零开始学习CSS(3)
  18. python中loc和iloc
  19. matlab求马尔可夫转移矩阵,求马尔科夫模型的转移矩阵_马尔科夫转移矩阵
  20. fastposter v2.11.0 天花板级的海报生成器

热门文章

  1. Hadoop Yarn容量调度器特点和分配算法介绍
  2. HDFS EditsLog和FsImage日志机制
  3. hbase中对deadserver处理存在的问题
  4. geotools读取shp文件及shp文件操作工具类代码
  5. Spring MVC生成PDF文件代码示例
  6. angluar ajax实例,Angular服务Request异步请求的实例讲解
  7. Java中int和short的取值范围_我的处理器上C中的int,short和其他数据类型的范围?...
  8. Qt之QObjectCleanupHandler使用介绍
  9. SPSS学习笔记之——两独立样本的非参数检验(Mann-Whitney U )
  10. Matlab实现字符串分割