01
0101
分數規劃與樹形dpdp
dp結合題意:
求∑ pi
∑s
i\frac}}
∑si∑p
i的最大值,我們可以二分乙個v
vv,則我們只需要求∑pi
>∑s
i∗v=
=>∑p
i−∑s
i∗
v>
0\sum>\sum*v~==>~\sum-\sum*v>0~
∑pi
>∑s
i∗v
==>∑p
i−∑
si∗
v>0就okok
ok讓每乙個點的權值等於pi−
si∗v
-*vpi
−si
∗v,然後做乙個樹形dp。
樹形d pdp
dp就直接用有依賴的揹包問題則可以解決
最後乙個注意點就是這題有乙個虛根,也就是0號節點
#include
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define ll long long
#define eps 1e-4
using
namespace std;
const
int maxn=
1e5+10;
const
int maxm=
2500+10
;int n,cnt,m;
double f[maxm]
[maxm]
,head[maxn]
,w[maxn]
;int fa[maxn]
,size[maxn]
;double l=
0.0,r=
10000.0
,ans=0;
template
<
class
t>
inline
void
read
(t &x)
while
(isdigit
(ch)
) x*
=f;}
struct nodea[maxn]
;struct
e[maxn]
;void
add(
int u,
int v)
void
readdata()
}void
dfs(
int u,
double mid)}}
}void
work()
printf
("%.3lf"
,l);
}int
main()
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個人,...