JSOI2016 最佳團隊

2021-09-09 08:49:33 字數 936 閱讀 2003

這題,二分+樹上揹包即可。

由於答案要最大(最值),所以我們可以二分

然後我們可以簡化一下答案。

那麼每個點的貢獻即為 p[i]-mid*s[i]。

做樹上揹包,看一下f[0][k]是否大於0即可。

上標:

#include

#include

#include

#define db double

using namespace std;

struct nodee[

5010];

int k,n,s[

2510

],p[

2510

],r[

2510];

int son[

2510

],tail[

2510

],cnt=0;

db f[

2510][

2510

],le,ri,mid;

inline

intread()

void

add(

int u,

int v)

; tail[u]

=cnt;

}void

dfs(

int x)

}bool check

(db x)

dfs(0)

;return f[0]

[k]>

0.0;

}int

main()

printf

("%.3lf\n"

,le)

;return0;

}

JSOI2016 最佳團隊

這種最大化形如 x y 的式子的題,很容易想到分數規劃。二分答案,對於當前的mid,設d i p i mid s i 考慮到當乙個節點i被選,那麼fa i 也要被選,那麼乙個想法是選取當前最大的d,然後把它的兒子的d放入堆裡。但是這個方法是錯誤的 然而我一開始就這麼打了,只有10分 題目給出的是一棵...

JSOI2016 最佳團隊

看到這個什麼比值最大,立馬想到了二分答案。然後就變成了乙個樹上揹包問題,直接暴力合併揹包即可。暴力合併不是o n3 的嗎?記錄一下子樹的大小,揹包時的上界設為這個,就降成o n2 感性證明 你可以想象兩個點只會在它們的lca處合併。code include include define fd i,x...

JSOI 2016 最佳團體

有 n n 名候選人,從 1 role presentation 11到 n n 編號,有乙個隊長的編號為 0 role presentation 0 0,每個候選人都由一位編號比他小的候選人推薦 如果為 0 0 則表示是隊長推薦的 隊長希望招募 k role presentation k k個人,...