BZOJ3829: [Poi2014]FarmCraft
来源:互联网 发布:python .dot 编辑:程序博客网 时间:2024/03/29 01:30
题目大意:给一棵树,走过每条边需要花费一个时间,安装软件又需要花费一个时间,需要遍历整棵树并回到起点,想让所有点中到达时间+安装时间的最大值最小,问这个值是多少
显然每条边最多被走两边,否则一定不是最优解
这就相当于从一个节点进入他的一个子树之后,一定遍历完了才回来
所以我们可以进行贪心
对每个节点记录两个值,一个是从这个节点下去遍历所有子节点之后再回来所需要花费的时间,另一个是假设从0时刻开始到达这个点并接下来遍历这个子树,安装完成的时间的最大值最小是多少
然后怎么用子树的信息来更新父节点呢?
我们可以贪心得排一个序,然后按顺序走完这些子树,直接算出父节点的值
不妨设ti为从i开始遍历一圈回来的时间,bi为这颗子树最大值的最小值
然后子树i排在j前面当且仅当max(1+bi,3+ti+bj)<max(1+bj,3+tj+bi)
所以按照这个写排序函数然后后面贪心就好啦!!!
#include<iostream>#include<cstdio>#include<algorithm>#define N 1000010using namespace std;int c[N];int to[N],nxt[N],pre[N],cnt;void ae(int ff,int tt){cnt++;to[cnt]=tt;nxt[cnt]=pre[ff];pre[ff]=cnt;}struct ppp{int t,b;};ppp a[N];int fa[N],ti[N];bool cmp(ppp x,ppp y){return max(x.b,2+x.t+y.b)<max(y.b,2+y.t+x.b);}void build(int x){int i,j,cnt=0;for(i=pre[x];i;i=nxt[i]){j=to[i];if(j==fa[x]) continue;fa[j]=x;build(j);ti[x]+=2+ti[j];}for(i=pre[x];i;i=nxt[i]){j=to[i];if(j==fa[x]) continue;cnt++;a[cnt].t=ti[j];a[cnt].b=c[j];}sort(a+1,a+cnt+1,cmp);int sum=0,maxn=0;for(i=1;i<=cnt;i++){sum++;maxn=max(maxn,sum+a[i].b);sum+=a[i].t+1;}if(x==1) c[x]=max(sum+c[x],maxn);else c[x]=max(c[x],maxn);}int main(){int n,m;scanf("%d",&n);int i,j,x,y;for(i=1;i<=n;i++)scanf("%d",&c[i]);for(i=1;i<n;i++){scanf("%d%d",&x,&y);ae(x,y);ae(y,x);}build(1);printf("%d",c[1]);}
0 0
- BZOJ3829: [Poi2014]FarmCraft
- 【bzoj3829】 [Poi2014]FarmCraft
- BZOJ3829: [Poi2014]FarmCraft
- [Poi2014]FarmCraft
- [Poi2014]FarmCraft
- 3829: [Poi2014]FarmCraft
- [Poi2014]FarmCraft 树状dp
- BZOJ 3829 Poi2014 FarmCraft 树形DP+贪心
- BZOJ 3829: [Poi2014]FarmCraft 树形dp
- 树规+贪心 问题 B: [Poi2014]FarmCraft
- POI2014
- POI2014 题解
- [Bzoj3524][Poi2014]Couriers
- BZOJ 3524: [Poi2014]Couriers
- bzoj3524[Poi2014]Couriers
- bzoj 3524: [Poi2014]Couriers
- 【bzoj 3832】: [Poi2014]Rally
- Poi2014 Solar lamp
- Spring依赖注入:注解注入总结
- declare-styleable:自定义控件的属性
- Linux下后台挂起和杀死进程
- 完整详解GCD系列(三)dispatch_group
- caffe+Ubuntu14.04+cuda+cudnn+opencv配置
- BZOJ3829: [Poi2014]FarmCraft
- android 设置webview的浏览器标识 User-Agent
- 启动及重新启动nginx,重启nginx后丢失nginx.pid问题解决
- Android WebView开发问题及优化汇总
- 343. Integer Break 分析证明与python解答
- 搜索引擎选择: Elasticsearch与Solr
- 前端模块化
- HDU 1272 小希的迷宫 (并查集判断回路、连通)
- Elasticsearch源码分析十一--查询分析器Analyzer注册过程