自底向上贪心。
每次给儿子排序,贪心地从小到大删,直到不能删。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; #define N 2000010 int n,m; struct edge { int to,next; }e[N]; int head[N<<1]; int cnt; int a[N],c[N]; int ans; int x,xx; void link(int u,int v) { e[++cnt]=(edge){v,head[u]}; head[u]=cnt; } void dfs(int x) { for (int i=head[x];i;i=e[i].next) dfs(e[i].to); cnt=0; for (int i=head[x];i;i=e[i].next) c[++cnt]=a[e[i].to]; sort(c+1,c+cnt+1); for (int i=1;i<=cnt;i++) { if (a[x]+c[i]-1>m) break; a[x]+=(c[i]-1),ans++; } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) { scanf("%d",&x); a[i]+=x; for (int j=1;j<=x;j++) scanf("%d",&xx),link(i,xx+1); } dfs(1); printf("%d\n",ans); return 0; }
时间: 2024-10-12 12:31:58