【bzoj3829】[Poi2014]FarmCraft 贪心
原文地址:http://www.cnblogs.com/GXZlegend/p/6826667.html
题目描述
输入
输出
样例输入
6
1 8 9 6 3 2
1 3
2 3
3 4
4 5
4 6
样例输出
11
题解
贪心
设f[i]表示子树i全部安装完成所需的最小总时间。
那么对于一个某结点x,f[x]一定大于等于c[x]。
若其为非叶子结点,考虑其子树a和b。
若先安装a再安装b,则a消耗的时间为f[a]+1,b消耗的时间为2*si[a]+f[b]+1
若先安装b再安装a,则a消耗的时间为2*si[b]+f[a]+1,b消耗的时间为f[b]+1
若先安装a合适,则必有2*si[a]+f[b]+1>2*si[b]+f[a]+1,即f[a]-2*si[a]<f[b]-2*si[b]
于是可以将x的所有子树按照f-2si从小到大排序,依次统计答案。
由于题目描述必须先完成2~n再完成1,所以应先将1的时间看作0,再分开计算。
#include <cstdio>
#include <algorithm>
#define N 500010
using namespace std;
struct data
{
int f , si;
}k[N] , a[N];
int head[N] , to[N << 1] , next[N << 1] , cnt , c[N];
bool cmp(data a , data b)
{
return a.f - 2 * a.si > b.f - 2 * b.si;
}
void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x , int fa)
{
int i , tot = 0 , now = 1;
k[x].f = c[x] , k[x].si = 1;
for(i = head[x] ; i ; i = next[i]) if(to[i] != fa) dfs(to[i] , x) , k[x].si += k[to[i]].si;
for(i = head[x] ; i ; i = next[i]) if(to[i] != fa) a[++tot] = k[to[i]];
sort(a + 1 , a + tot + 1 , cmp);
for(i = 1 ; i <= tot ; i ++ ) k[x].f = max(k[x].f , a[i].f + now) , now += 2 * a[i].si;
}
int main()
{
int n , i , x , y , t;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &c[i]);
t = c[1] , c[1] = 0;
for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
dfs(1 , 0);
printf("%d\n" , max(k[1].f , t + 2 * (k[1].si - 1)));
return 0;
}
【bzoj3829】[Poi2014]FarmCraft 贪心的更多相关文章
- [BZOJ3829][Poi2014]FarmCraft 贪心
		这个题应该是很容易想到贪心的,只要可是怎么贪才是科学的呢?我们分析一下题干,对于每个边只能一进一出因此,对于树上的一棵子树,我们只要一进子树就必须遍历完,因此我们只能进行一遍 dfs() 然后我们发现 ... 
- BZOJ3829[Poi2014]FarmCraft——树形DP+贪心
		题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of ho ... 
- BZOJ3829 [Poi2014]FarmCraft  【树形dp】
		题目链接 BZOJ3829 题解 设\(f[i]\)为从\(i\)父亲进入\(i\)之前开始计时,\(i\)的子树中最晚装好的时间 同时记\(siz[i]\)为节点\(i\)子树大小的两倍,即为从父亲 ... 
- BZOJ3829 : [Poi2014]FarmCraft
		d[x]表示走完x的子树并回到x所需的时间 f[x]表示从走到x开始计时,x子树中最晚的点安装完的最早时间 d[x]=sum(d[i]+2),i是x的孩子 f[x]的计算比较复杂: 考虑将x的各棵子树 ... 
- 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
		[BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are houses connected ... 
- [补档][Poi2014]FarmCraft
		[Poi2014]FarmCraft 题目 mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒 ... 
- [BZOJ 3829][POI2014] FarmCraft
		先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 421 Solved: 197[ ... 
- bzoj 3829: [Poi2014]FarmCraft  树形dp+贪心
		题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ... 
- [Poi2014]FarmCraft 树状dp
		对于每个点,处理出走完其子树所需要的时间和其子树完全下载完软件的时间 易证,对于每个点的所有子节点,一定优先选择差值大的来给后面的时间 树规+贪心. #include<cstdio> #i ... 
随机推荐
- fcc初级算法方法总结
			var arr = str.split("分隔符"): var newArr = arr.reverse(); var str = arr.join("连接符" ... 
- ios统计流量代码
			#include <ifaddrs.h> #include <sys/socket.h> #include <net/if.h> 1.3G/GPRS流量统计 int ... 
- iOS MapKit地图
			地图框架:#import <MapKit/MapKit.h> 基本属性和方法: 属性: 地图类视图:MKMapView 地图类型:MKMapType mapType 地图旋转:rotate ... 
- CBCGPImage的GetSize的问题及解决方法
			BCGControlBar Pro for MFC 25.10是目前(2018-07-16)网上能够找到的最新能够使用的版本,我配合Visual Studio 2010使用.在单文档MFC程序的视图中 ... 
- 【学时总结】◆学时·VII◆ 高维DP
			◆学时·VII◆ 高维DP 自学之余,偶遇DP…… ◇ 算法概述 顾名思义——一种处理多方面状态的DP,这种DP特点是……每一维的大小都不算太大(不然用dp数组存储下来内存会炸),而且枚举时容易超时… ... 
- django+xadmin在线教育平台(九)
			django admin介绍 上一章我们进行了需求分析和数据库设计.本章我们来快速搭建一个可用的后台管理系统. 后台管理系统特点: 权限管理 少前端样式.(样式一般不是很看重), 快速开发 djang ... 
- Nginx无法加载.woff .eot .svg .ttf等解决办法
			在Nginx的配置文件,加上以下代码即可修复该问题 location ~ \.(eot|otf|ttf|woff|svg)$ { add_header Access-Control-Allow-Ori ... 
- spring-mvc.xml的定时器配置
			<!-- 设置时间 --> <bean id="myJobTrigger" class="org.springframework.scheduling. ... 
- ethereum(以太坊)(四)--值传递与引用传递
			contract Person { string public _name; function Person() { _name = "liyuechun"; } function ... 
- day1_作业2(三级菜单)--改进版
			#!/usr/local/bin/python3 # -*- coding:utf-8 -*- province={ '江苏省':{ '南京市':['秦淮区','玄武区','栖霞区'], '苏州市': ... 
