(感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译。。。。。。)

题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权,要最小化max(点权+到达时间) <---所有点的

首先这看起来就是一道DP题,但是根据直觉,,,应该跟贪心挂钩,因为感觉耗时久的要先去是吧

但是我们发现并不能这么弄,因为去一棵子树就要走完它,这个时候再去别的树的时候可能已经很晚了,所以就不一定优了

不过我们可以发现,从一个点出发,去节点的顺序就决定了答案

于是我们考虑排序

但是节点太多比较难以分析,因此我们先以两个儿子为例分析。

f[i]代表以i为根的最大时长,

于是目的就是最小化f[1],size[i]代表遍历这个点要多久,

因为要遍历完这个子树才可以去另一棵,于是就有转移方程:

f[i]=max(f[a],f[b] + size[a] + 2),其中a,b为两棵子树,+2是去a的那条边来回的时间,这个是先去a的,

f[i]=max(f[b],f[a] + size[b] + 2),然后就是最小化这4个式子中的最大值,

PS:等等,,,貌似是f[a]+1????,懒得改了,,,大家自行脑补成f[a]+1吧,不影响结果

于是先按照国王游戏里面的方法来推导一下:

首先设先去a比较优,

那么有max(f[a],f[b] + size[a] + 2) < max(f[b],f[a] + size[b] + 2)

因为f[a] + size[b] + 2 > f[a],f[b] + size[a] + 2 > f[b],

所以这4个式子的最大值不可能会是f[a] or f[b],

所以要使得等式成立就只能寄希望于

f[b] + size[a] + 2 < f[a] + size[b] + 2

所以以这个为条件排序即可

各种细节QAQ调了好久

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 501000
#define getchar() *o++
#define LL long long
char READ[],*o=READ;
int n,ans;
int cost[AC],size[AC];
int date[AC * ],Next[AC * ],Head[AC],tot;
struct point{
int size;
LL f;
}p[AC];
LL f[AC];
inline int read()
{
int x=;char c=getchar();
while(c > '' || c < '') c=getchar();
while(c >= '' && c <= '') x=x*+c-'',c=getchar();
return x;
} inline void add(int f,int w)
{
date[++tot]=w,Next[tot]=Head[f],Head[f]=tot;
date[++tot]=f,Next[tot]=Head[w],Head[w]=tot;
} inline bool cmp(point a,point b)
{
return b.f + a.size < a.f + b.size;
} void pre()
{
R a,b;
n=read();
for(R i=;i<=n;i++) cost[i]=read();
for(R i=;i<n;i++)
{
a=read(),b=read();
add(a,b);
}
} void DFS(int x,int fa)//还是要传father,不然的话下面加入队列的部分就判断不了了,因为这时下面都已经访问过了
{
int now,tot=;
if(x != ) f[x] = cost[x];//至少自己要装啊,但是注意第一个是最后装的
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(now == fa) continue;
DFS(now,x);
}
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(now != fa)
p[++tot]=(point) {size[now],f[now]};//不能在上面加,因为一旦下一次调用了DFS,队列里就乱了
}
sort(p+,p+tot+,cmp);
for(R i=;i<=tot;i++)
{
f[x]=max(f[x],p[i].f + size[x] + );
size[x] += p[i].size + ;//反正这样也是统计了一样的东西
}
} int main()
{
freopen("in.in","r",stdin);
fread(READ,,,stdin);
pre();
DFS(,);
printf("%lld\n",max(f[],(LL)(n * - + cost[])));
fclose(stdin);
return ;
}

[POI2014]FAR-FarmCraft

[POI2014]FAR-FarmCraft 树形DP + 贪心思想的更多相关文章

  1. bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心

    题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ...

  2. BZOJ3829[Poi2014]FarmCraft——树形DP+贪心

    题目描述 In a village called Byteville, there are   houses connected with N-1 roads. For each pair of ho ...

  3. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  4. 【BZOJ3872】[Poi2014]Ant colony 树形DP+二分

    [BZOJ3872][Poi2014]Ant colony Description 给定一棵有n个节点的树.在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁.这些蚂蚁会相继进入树中, ...

  5. [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)

    传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...

  6. codeforces 212E IT Restaurants(树形dp+背包思想)

    题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...

  7. 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并

    题目大意 ​ 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) ​ \(1\leq n\leq 1 ...

  8. 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)

    [BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are   houses connected ...

  9. POI2014 FAR-FarmCraft 树形DP+贪心

    题目链接 https://www.luogu.org/problem/P3574 题意 翻译其实已经很明确了 分析 这题一眼就是贪心啊,但贪心的方法要思索一下,首先是考虑先走时间多的子树,但不太现实, ...

随机推荐

  1. ORB-SLAM(八)ORBmatcher 特征匹配

    该类负责特征点与特征点之间,地图点与特征点之间通过投影关系.词袋模型或者Sim3位姿匹配.用来辅助完成单目初始化,三角化恢复新的地图点,tracking,relocalization以及loop cl ...

  2. Qt-LCD电子时钟

    先上效果图吧 就是这个样子,简单的时间显示时间. 这里需要注意的是,我们最好建立一个空文件,这里我们需要建立一个集成QLCDNumber的类 具体方法如下图 一下是源代码 digiclock.h #i ...

  3. Selenium(Python)PageObject页面对象

    使用PageObject页面对象的好处是, 当页面元素的位置发生改变时, 只需要去修改Xpath或者ID, 而不用去修改测试用例本身: 本次的思路是: 1.常用方法类 2.页面对象类 3.测试用例类 ...

  4. Python文件操作大全

    Python 编程文件操作大全   文件打开模式 打开模式 执行操作 'r' 以只读方式打开文件(默认) 'w' 以写入的方式打开文件,会覆盖已存在的文件 'x' 如果文件已经存在,使用此模式打开将引 ...

  5. Java开发工程师(Web方向) - 01.Java Web开发入门 - 第5章.Git

    第5章--Git 版本控制简介 VCS (version control system) 版本控制系统:记录若干文件的修订记录的系统,帮助查阅/回到某个历史版本 LVCS本地 CVCS集中式(Cent ...

  6. 1053 Path of Equal Weight (30 分)(树的遍历)

    题目大意:给出树的结构和权值,找从根结点到叶子结点的路径上的权值相加之和等于给定目标数的路径,并且从大到小输出路径 #include<bits/stdc++.h> using namesp ...

  7. 【Linux】Face Recognition的封装

    使用虹软的人脸识别 写了一个linux下的Face Recognition的封装,当作是练习. C++的封装,结合opencv,使用方便.https://github.com/zacario-li/F ...

  8. CryptoZombies学习笔记——Lesson3

    第三课就开始深入讲解solidity编程技巧了. chapter1: 智能合约的不变性. 合约一旦部署到以太坊后,就不可更改了,所以从一方面来说,智能合约代码的安全性是如此重要,因为一旦发现你的代码里 ...

  9. .net转PHP从零开始-环境的搭建

    PHP初级开发环境安装很简单,只需要使用一键安装的phpstudy 下载地址:http://www.phpstudy.net/ 安装后可以看到 这样的界面,设置好相关的配置,然后,选择查看phpinf ...

  10. Lecture Sleep(尺取+前缀和)

    Description 你的朋友Mishka和你参加一个微积分讲座.讲座持续n分钟.讲师在第i分钟讲述ai个定理.   米什卡真的对微积分很感兴趣,尽管在演讲的所有时间都很难保持清醒.给你一个米什卡行 ...