博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2003]消防局的设立
阅读量:4664 次
发布时间:2019-06-09

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

题目描述

2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d。

由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾。

你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时,消防队有能力及时扑灭火灾。

输入格式

输入文件名为input.txt。

输入文件的第一行为n (n<=1000),表示火星上基地的数目。接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a[i],表示从编号为i的基地到编号为a[i]的基地之间有一条道路,为了更加简洁的描述树状结构的基地群,有a[i]<i。

输出格式

输出文件名为output.txt

输出文件仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。


好好的一道dp生生地做成了贪心

不过,挺好的

#include
#define re return#define inc(i,l,r) for(int i=l;i<=r;++i)using namespace std;template
inline void rd(T&x){ char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x; }const int maxn=2005; int n,m,k,d[maxn],hide[maxn],dis[maxn],fa[maxn];inline bool cmp(int x,int y){ re d[x]>d[y];}int main(){ freopen("in.txt","r",stdin); int x,y,z; rd(n); hide[1]=1;dis[1]=dis[0]=n; inc(i,2,n) { rd(fa[i]); hide[i]=i; d[i]=d[fa[i]]+1; dis[i]=n; } sort(hide+1,hide+n+1,cmp); int ans=0; inc(i,1,n) { x=hide[i]; y=fa[x];z=fa[y]; //向下覆盖 dis[x]=min(dis[x],min(dis[y]+1,dis[z]+2)); if(dis[x]>2) { ++ans; dis[z]=0; dis[fa[z]]=min(dis[fa[z]],1);//向上覆盖 dis[fa[fa[z]]]=min(dis[fa[fa[z]]],2); } } printf("%d",ans); re 0;}

 

转载于:https://www.cnblogs.com/lsyyy/p/11433059.html

你可能感兴趣的文章
假如爱有天意
查看>>
php 过滤emoji表情
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
scrollview里container拖动显示问题
查看>>
001使用gltf创建3d模型
查看>>
cas 持久化TGT到mysql JPA方式 增加自定义字段
查看>>
监听屏幕解锁事件
查看>>
idea 注册码 地址:
查看>>
接上个内容, 问题:首次进入时调用了两次接口
查看>>
图片放大不失真软件PhotoZoom如何使用?
查看>>
【dfs】POJ1321 棋盘问题
查看>>
opencv-python教程学习系列10-颜色空间转换
查看>>
1-4-07:收集瓶盖赢大奖
查看>>
cnblogs正式启用
查看>>
带参装饰器,迭代器与生成器
查看>>
sprint2第五天任务完成情况
查看>>
如何进行Apache虚拟机设置
查看>>
【水滴石穿】报错解决不了
查看>>
Qt之Tab键实现(自由切换焦点)
查看>>
Codeforces 920F. SUM and REPLACE / bzoj 3211 花神游历各国
查看>>