[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 }
View Code

 

posted @ 2017-01-08 13:23  KingSann  阅读(132)  评论(0)    收藏  举报