洛谷P5521 梅深不見冬(貪心)

2022-08-21 04:51:15 字數 1487 閱讀 4106

設答案為$f_u$。

對於葉子結點,$f_u=w_u$。

對於非葉子結點,考慮它的所有兒子$v$,設有$m$個,則只要最小化$\max\limits^m_((\sum\limits^_w_)+f_)$,$f_u$即為最小化的答案。

那麼如何最小化這個東西呢?把所有兒子按$f_v-w_v$降序排序即可。

證明:考慮兩個兒子的情況,我們只需證明按上述方法排序後有$\max(f_1,w_1+f_2)\le \max(f_2,w_2+f_1)$。

若$\max(f_1,w_1+f_2)=f_1,\max(f_2,w_2+f_1)=w_2+f_1$顯然成立;

若$\max(f_1,w_1+f_2)=f_1,\max(f_2,w_2+f_1)=f_2$,則$f_2>f_1$,成立;

若$\max(f_1,w_1+f_2)=w_1+f_2,\max(f_2,w_2+f_1)=f_2$,則$f_2若$\max(f_1,w_1+f_2)=w_1+f_2,\max(f_2,w_2+f_1)=w_2+f_1$,則由$f_1-w_1\ge f_2-w_2$知$w_1+f_2\le w_2+f_1$,成立。

用數學歸納法可知結論對於更多兒子也成立。

#include#include

#include

using

namespace

std;

const

int n=100050

;char rb[1

<<21],*rs,*rt,wb[(1

<<21)+50

];int wp=-1

;inline

char gc()

inline

void flush()

inline

intrd()

short buf[15

];inline

void wt(int

x) wb[++wp]=x|48

;

while(l>=0)wb[++wp]=buf[l--]|48

; wb[++wp]='';

}int

a[n],g[n],to[n],nxt[n],f[n];

vector

p[n];

inline

bool cmp(int x,int y)

void dfs(int

u) sort(p[u].begin(),p[u].end(),cmp);

for(i=0;iif(res>=f[p[u][i]])res-=a[p[u][i]];

else

f[u]+=max(0,a[u]-res);

}int

main()

for(i=1;i<=n;++i)a[i]=rd();

dfs(1);

for(i=1;i<=n;++i)wt(f[i]);

flush();

return0;

}

view code

洛谷P1036 深搜

原題目 給定n個數字裡面選擇k個數字進行操作,使用遞迴操作。也類似於深搜。include using namespace std int ans 0,n,k,a 25 bool prime int x return true void rec int start,int count,int sum ...

洛谷P1312 Mayan遊戲(深搜)

mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個 7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下 1 每步移動可以且僅可以沿橫向 即向左或向右 拖動某一方塊一格 當...

洛谷P1101 單詞方陣 深搜

題目描述 給一n n的字母方陣,內可能蘊含多個 yizhong 單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 8 個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,將不是單詞的字母用 代替,以突出顯示單詞。例如 輸入 輸出 8 qyizhon...