[bzoj4027][HEOI2015]兔子与樱花_贪心_树形dp

匿名 (未验证) 提交于 2019-12-03 00:40:02

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> const int maxn=2000010,maxm=maxn<<1; using namespace std; int n,m,pre[maxm],now[maxn],son[maxm],tot,c[maxn],a[maxn],ans; bool ok;char ch; void read(int &x){ 	for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1; 	for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar()); 	if (ok) x=-x; } void add(int a,int b){pre[++tot]=now[a],now[a]=tot,son[tot]=b;} void dfs(int x){ 	for (int y=now[x];y;y=pre[y]) dfs(son[y]); 	int cnt=0; 	for (int y=now[x];y;y=pre[y]) a[++cnt]=c[son[y]]; 	sort(a+1,a+1+cnt); 	for (int i=1;i<=cnt;i++){ 		if (c[x]+a[i]-1>m) break; 		c[x]+=(a[i]-1),ans++; 	} } int main(){ 	scanf("%d%d",&n,&m); 	for (int i=1;i<=n;i++) read(c[i]); 	for (int i=1,x,num;i<=n;i++){ 		read(num),c[i]+=num; 		for (int j=1;j<=num;j++) read(x),x++,add(i,x); 	} 	dfs(1),printf("%d\n",ans); 	//for (int i=1;i<=n;i++) printf("%d %d %d\n",i,f[i],g[i]); 	return 0; } 

小结:对于这种贪心的题,我们还是需要证明一下的... ...

原文:https://www.cnblogs.com/ShuraK/p/9277668.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!