[bzoj4027]兔子与樱花
看来该去恶补一下贪心了
对于某一个节点来说,可以发现从小到大选择它的儿子的cost是最优的(因为要选尽量多的节点),那么就可以去递归搞了,然后排个序就行。

1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 #include <set> 13 using namespace std; 14 15 vector<int>G[2100000]; 16 int n,m,c[2100000],ans;bool cmp(int a,int b){return c[a]<c[b];} 17 void dfs(int x){ 18 for(int i=0;i<G[x].size();i++)dfs(G[x][i]); 19 sort(G[x].begin(),G[x].end(),cmp); 20 c[x]+=G[x].size(); 21 for(int i=0;i<G[x].size();i++){ 22 if(c[x]+c[G[x][i]]-1<=m) 23 c[x]+=c[G[x][i]]-1,ans++; 24 else break; 25 } 26 } 27 int main(){ 28 scanf("%d%d",&n,&m); 29 for(int i=0;i<n;i++)scanf("%d",&c[i]); 30 for(int i=0;i<n;i++){ 31 int k,v;scanf("%d",&k); 32 for(int j=1;j<=k;j++)scanf("%d",&v),G[i].push_back(v); 33 } 34 dfs(0); 35 printf("%d\n",ans); 36 }