卧薪尝胆,厚积薄发。
HEOI2015 兔子与樱花
Date: Wed Sep 12 09:00:06 CST 2018
In Category:
NoCategory
Description:
有一颗树,每个节点儿子节点的数量加这个点的权值不能超过给定的
$m$
,如果删去这个点,那么这个点的儿子节点会挂在父亲节点上,这个点的权值也会加到父亲节点上,问整棵树最多能删几个点。
$1\le n \le 2000000$
Solution:
如果每个点代价不同,那么很可能是DP,如果每个点代价都为1,那么很可能是贪心。
如果知道是贪心的话那就不难想到把所有子节点按权值
$+$
儿子节点个数排序选最小的删除,因为儿子节点的价值会全部转移到父节点上。
为什么是正确的呢?设
$f[i]$
表示权值
$+$
儿子节点个数,那么兄弟之间显然一定选
$f[i]$
小的,关键问题是会不会因为这次选了
$i$
而导致在父亲
$j$
的父亲
$k$
那里丢掉价值呢?并不会,因为设
$j$
的兄弟为
$p$
,若
$f[p]\le f[j]$
,那么
$p$
该选还会选,若
$f[p]>f[j]$
,那么增加了
$j$
的权值后最多只会挤掉一个,而之前已经选了一个
$i$
所以不会更劣。
所以
$dfs$
在回溯的时候把儿子节点排序贪心就行了。
Code:
In tag:
算法-贪心
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡