【bzoj4027】[HEOI2015]兔子与樱花(树上贪心)
2017-09-25 13:49
351 查看
题目:
我是超链接题解:
思路还是挺好想的对于一个节点来说权值是儿子的个数+c[i],我们不如把ta们合在一起看;作为你要怎么选?当然选择儿子中权值最小的那个,把ta删掉啊;那么一个从底向上贪心的过程就想好了
代码:
#include <cstdio> #include <algorithm> #define N 2000005 using namespace std; int tot,nxt[N*2],point ,v[N*2],a ,b ,f ,m,num,ans; void addline(int x,int y) { ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; } void dfs(int x,int fa) { for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa) dfs(v[i],x); b[0]=0; for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa) b[++b[0]]=a[v[i]]; sort(b+1,b+b[0]+1); for (int i=1;i<=b[0];i++) if (a[x]+b[i]-1<=m) a[x]+=b[i]-1,ans++; else break; } int main() { int n,i,j; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) scanf("%d",&a[i]); for 4000 (i=1;i<=n;i++) { int k;scanf("%d",&k);a[i]+=k; for (j=1;j<=k;j++) { int x;scanf("%d",&x);x++; addline(i,x); } } dfs(1,0); printf("%d",ans); }
相关文章推荐
- BZOJ 4027: [HEOI2015]兔子与樱花 树上dp
- 【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
- BZOJ 4027 HEOI2015 兔子与樱花 树形贪心
- 【BZOJ4027】【HEOI2015】兔子与樱花 贪心
- BZOJ 4027: [HEOI2015]兔子与樱花 贪心
- 【BZOJ4027】【HEOI2015】兔子与樱花(贪心+dp)
- 【bzoj4027】【HEOI2015】兔子与樱花【贪心】
- BZOJ 4027 [HEOI2015]兔子与樱花 - 贪心
- BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)
- bzoj4027 [HEOI2015]兔子与樱花(贪心)
- [bzoj4027][HEOI2015]兔子与樱花_贪心_树形dp
- [BZOJ4027][HEOI2015]兔子与樱花(贪心)
- [BZOJ4027]HEOI2015兔子与樱花|贪心
- 【BZOJ4027】[HEOI2015]兔子与樱花 贪心
- BZOJ4027 [HEOI2015]兔子与樱花 树形dp+贪心
- [bzoj4027][HEOI2015][兔子与樱花] (树形dp思想+玄学贪心)
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
- 【bzoj4027】[HEOI2015]兔子与樱花
- 4027: [HEOI2015]兔子与樱花 贪心
- 【bzoj4027】 [HEOI2015]兔子与樱花