Bzoj4027 兔子與櫻花

2021-08-01 13:26:52 字數 957 閱讀 2454

給乙個n個結點的樹,每個結點有最大載重m,上面有c[i]朵花,對於每個結點,它的兒子個數和花的朵數不能超過m。現在可以刪掉一些結點,每刪掉乙個,它的花就會給父親,求最多能刪掉多少結點。

樹形dp+貪心。

可以直接dfs遞迴實現。

顯然從權值小的開始刪起。

#include 

#include

#include

#define rep( i , _begin , _end ) for(int i=(_begin),i##_end=(_end);i<=(i##_end);i++)

#define for( i , _begin , _end ) for(int i=(_begin),i##_end=(_end);i!=(i##_end);i++)

#define lop( i , _begin , _end ) for(int i=(_begin),i##_end=(_end);i>=(i##_end);i--)

#define dnt( i , _begin , _end ) for(int i=(_begin),i##_end=(_end);i!=(i##_end);i--)

using

std :: min;

using

std :: max;

const

int maxx = 2000000 + 25;

int c[maxx];

std :: vector

g[maxx];

int n,m,x,y,z,ans;

bool cmp(int a,int b)

void dfs(int x)

else

break;

}}int main()

}dfs(0);

printf("%d",ans);

return

0;}

bzoj4027 兔子與櫻花

看來該去惡補一下貪心了 對於某乙個節點來說,可以發現從小到 擇它的兒子的cost是最優的 因為要選盡量多的節點 那麼就可以去遞迴搞了,然後排個序就行。1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 inc...

BZOJ4027 兔子與櫻花

time limit 10 sec memory limit 256 mb 很久很久之前,森林裡住著一群兔子。有一天,兔子們突然決定要去看櫻花。兔子們所在森林裡的櫻花樹很特殊。櫻花樹由n個樹枝分叉點組成,編號從0到n 1,這n個分叉點由n 1個樹枝連線,我們可以把它看成乙個有根樹結構,其中0號節點是...

BZOJ4027 兔子與櫻花(貪心)

bzoj 洛谷很直觀的乙個感受就是對於每個節點,考慮它的所有兒子,如果能刪就刪。那麼我們把所有兒子按照給刪去後給父親c i c i 的貢獻從小往大排序,能刪就刪即可。include include using namespace std define ll long long define max ...