分数规划!

发布时间 2023-09-08 09:54:19作者: OIer_xxx2022

分数规划

前言:教练要求过《算法竞赛》的东西,然后翻了一翻选了一个看起来比较好写的开始。

问题:给出一组\(a_i\)\(b_i\),求一组\(w_i\),使

\[\frac{\sum a_i \times w_i}{\sum b_i \times w_i} \]

最小或最大。

考虑进行二分答案,记此时二分到的答案为\(mid\),则有:

\[\frac{\sum a_i \times w_i}{\sum b_i \times w_i} >mid \]

\[\sum a_i \times w_i - \sum b_i \times w_i \times mid >0 \]

\[\sum w_i \times (a_i -b_i \times mid)>0 \]

则二分check只需求不等式左边的最大值即可。

Talent Show

可以按照刚才的思路去做。

\[\sum w_i \times (a_i -b_i \times mid)>0 \]

这个时候可以考虑01背包,将\(b_i\)当作重量,将\(a_i-b_i \times mid\)作为价值,直接做就行。

此时\(dp_{n,W}\)即为最大值。

POJ2728

这道题还是挺板子的,和之前唯一不同的是这道题是在树上求解的。将\(a_i-mid \times b_i\) 作为权值,每次check时跑最小生成树即可。

最小圈

其实还是换汤不换药,只要推一推柿子就可以发现可以把\(a_i-mid\)作为边权做就行。然后因为要求得是最小值,所以每次判是否负环就行。

不过似乎有一个\(O(nm)\)的神仙做法 link

不过刚才那个做法就已经足够能通过本题了。