二分是個神奇的演算法,它能讓你難以維護的資料突然變得十分容易維護……[problem]
\color}
[problem]
[solution]
\color}
[solution]
是不是感覺總價值的那個式子特別難維護?
我們可以記 mid
\texttt
mid 表示總價值大於等於 mid
\texttt
mid。我們發現 mid
\texttt
mid 越大,越難以滿足,所以我們可以二分答案。
改寫乙個總價值那個式子:
∑ i∈
tpi∑
i∈ts
i≥
mid∑i∈
tpi≥
mid×∑i
∈tsi
∑i∈t
pi
−mid×∑
i∈ts
i≥0∑
i∈t(
pi
−mid×s
i)≥0
\begin \dfrac p_i}s_i} &\geq \texttt\\ \sum\limits_ p_i &\geq \texttt \times \sum \limits_s_i\\ \sum\limits_ p_i - \texttt \times \sum \limits_ s_i & \geq 0\\ \sum\limits_ \left (p_i - \texttt \times s_i \right ) & \geq 0 \end
i∈t∑s
ii∈
t∑p
ii
∈t∑
pii
∈t∑
pi−
mid×i∈
t∑s
ii∈
t∑(
pi−
mid×si
)≥
mid≥
mid×i∈
t∑s
i≥0
≥0改每個點的價值為 pi−
mid×si
p_i -\texttt \times s_i
pi−
mid×si
,原題被轉化為了乙個樹上 dp 的問題。只要最後的總價值 ≥
0\geq 0
≥0,代表 mid
\texttt
mid 是乙個可行答案。
如何樹上 dp?很簡單,記 fi,
jf_
fi,j
表示在 i
ii 的子樹中選 j
jj 個點時的最大總價值,原題被轉化為了乙個樹上揹包問題,可以用類似選課
一題的方法解決。
[code]
\color}
[code]
struct edgee[
2510];
int h[
2510
],tot;
inline
void
add(
int a,
int b)
;h[a]
=tot;
}double p[
2510
],s[
2510
],w[
2510];
double f[
2510][
2510];
//dp用陣列
int n,t,sze[
2510];
double l,r,mid;
inline
voiddp(
int u)
}const
int inf=
0x3f3f3f3f
;inline
bool
check
(double mid)
const
double eps=
1e-4
;int
main()
l=0.0
;r=10000.0
;while
(l+epsprintf
("%.3lf"
,l);
return0;
}
2019 08 18 日常總結
一本通1599 題意 在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。fj 有 nn 只排成一排的奶牛,編號為 11 到 nn。每只奶牛的效率是...
5059日常總結
1.乙個函式的形參是const char 實參是可以是char 如果乙個函式的返回值是const char 不能用char 來接收返回值 2.為什麼沒有靜態的建構函式和析構函式?建構函式成員函式使用現有分配構造指定的物件 即存在this。static成員函式指定物件沒有儲存,因此沒有關聯的例項要構造...
2019 10 01日常總結
前言 今天是祖國母親70歲生日,請允許我向祖國母親說一聲 生日快樂!願您永遠繁榮昌盛 山清水秀!題意 松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n nn個房間,並且有n 1 n 1n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請...