4027: [HEOI2015]兔子与樱花
2018-02-27 11:28
162 查看
题目链接
题目大意:一棵树,每个点有ci,保证全局参数m满足son(i)+ci≤m,其中son(i)表示i的儿子的个数,删除一个点后它的c和儿子由父亲继承,求最多删除点的个数
题解:直觉贪心
删掉一个结点的代价是c[i]+son[i]-1
很容易得到两个显然的结论:
1. 从下往上删最优
2. 每个节点先删代价最小的儿子最优
直接排序做就可以了……
我的收获:233333
题目大意:一棵树,每个点有ci,保证全局参数m满足son(i)+ci≤m,其中son(i)表示i的儿子的个数,删除一个点后它的c和儿子由父亲继承,求最多删除点的个数
题解:直觉贪心
删掉一个结点的代价是c[i]+son[i]-1
很容易得到两个显然的结论:
1. 从下往上删最优
2. 每个节点先删代价最小的儿子最优
直接排序做就可以了……
我的收获:233333
#include <bits/stdc++.h> using namespace std; const int N=2000010; int n,m,ans,c ; vector<int> E ; bool cmp(int a,int b){return c[a]<c[b];} void dfs(int x) { for(int i=0;i<E[x].size();i++) dfs(E[x][i]); sort(E[x].begin(),E[x].end(),cmp); for(int i=0;i<E[x].size();i++){ int t=c[E[x][i]]; if(c[x]+t-1<=m) c[x]+=t-1,ans++; else break; } } void work() { dfs(1); printf("%d\n",ans); } void init() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1,x,num;i<=n;i++){ scanf("%d",&num);c[i]+=num; for(int j=1;j<=num;j++) scanf("%d",&x),E[i].push_back(x+1); } } int main() { init(); work(); return 0; }
相关文章推荐
- 【BZOJ】【4027】【HEOI2015】兔子与樱花
- B20J_4027_[HEOI2015]兔子与樱花_树形DP
- BZOJ 4027: [HEOI2015]兔子与樱花 树上dp
- 【HEOI2015】【BZOJ4027】兔子与樱花
- [BZOJ4027]HEOI2015兔子与樱花|贪心
- [bzoj4027][HEOI2015]兔子与樱花_贪心_树形dp
- 【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
- [BZOJ4027][HEOI2015] 兔子与樱花
- BZOJ 4027: [HEOI2015]兔子与樱花
- BZOJ 4027 [HEOI 2015] 兔子与樱花 解题报告
- 【bzoj4027】[HEOI2015]兔子与樱花
- 【bzoj4027】[HEOI2015]兔子与樱花(树上贪心)
- 【BZOJ4027】【HEOI2015】兔子与樱花 贪心
- bzoj4027 [HEOI2015]兔子与樱花(贪心)
- BZOJ 4027: [HEOI2015]兔子与樱花
- bzoj4027 [HEOI2015]兔子与樱花
- BZOJ 4027 [HEOI2015]兔子与樱花 - 贪心
- BZOJ 4027: [HEOI2015]兔子与樱花 贪心
- 4027: [HEOI2015]兔子与樱花
- 【BZOJ4027】[HEOI2015]兔子与樱花 贪心