問題模型
給定 \(a,b\) 兩個長度為 \(n\) 的序列,求下列式子最大值:
\[\frac{\sum_{i = 1} ^ {n} a_i · x_i}{\sum_{i = 1} ^ {n} b_i · x_i}
\]
其中 \(\forall i \in [1, n], x_i \in \left \{1, 0 \right \}\)。
解法
不妨設我們已經求出了這個最大值 \(k\)。
那麼有:
\[\frac{\sum_{i = 1} ^ {n} a_i · x_i}{\sum_{i = 1} ^ {n} b_i · x_i} \le k
\]
把分母移過去:
\[\sum_{i = 1} ^ {n} a_i · x_i \le k · \sum_{i = 1} ^ {n} b_i · x_i
\]
再移右邊:
\[\sum_{i = 1} ^ {n} a_i · x_i - k · \sum_{i = 1} ^ {n} b_i · x_i \le 0
\]
\(k\) 乘進 \(\sum\) 裡面:
\[\sum_{i = 1} ^ {n} a_i · x_i - \sum_{i = 1} ^ {n} k · b_i · x_i \le 0
\]
合併 \(\sum\):
\[\sum_{i = 1} ^ {n} a_i · x_i - k · b_i · x_i \le 0
\]
提出 \(x_i\):
\[\sum_{i = 1} ^ {n} x_i · (a_i - k · b_i) \le 0
\]
於是一個整體貢獻被我們拆成了單體貢獻。
不難發現 \(k\) 影響整個式子的單調性,考慮二分 \(k\)。
此時 \(x_i\) 的取值是由 \(i\) 位置所對應的貢獻決定的,把每個貢獻算出來之後再去作文章。
舉個例子,約束 \(\sum_{i = 1} ^ n [x_i] \le k\) 時,將貢獻從大到小排序,至多取前 \(k\) 個大於 \(0\) 的貢獻即可。
這裡的時間複雜度就是 \(O(n \log n \log V)\) 的,其中 \(V\) 為值域。
有時可能會與 01 揹包和生成樹等結合起來,具體的會在下面的例題部分細講。