這題,二分+樹上揹包即可。
由於答案要最大(最值),所以我們可以二分。
然後我們可以簡化一下答案。
那麼每個點的貢獻即為 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個人,...