Codeforces 557B 經典貪心問題:給定 2n 個茶杯(n 個男生、n 個女生),茶壺容量 w,男生喝水量為女生的 2 倍,求最大可倒水總量。
x 毫升,男生每人分得 2x 毫升n*x + n*2x = 3n*xx ≤ min(女生杯容量最小值, 男生杯容量最小值 / 2)
3n*x ≤ w (茶壺容量限制)
x ≤ a[0](最小杯)2x ≤ a[n] → x ≤ a[n] / 2x = min(a[0], a[n]/2, w/(3n))3n*x#include <bits/stdc++.h>
using namespace std;
int main() {
int n, w;
cin >> n >> w;
vector a(2 * n);
for (int i = 0; i < 2 * n; ++i) cin >> a[i];
sort(a.begin(), a.end());
double x = min({(double)a[0], (double)a[n] / 2.0, (double)w / (3 * n)});
printf("%.8f\n", 3 * n * x);
return 0;
}
| 輸入 | 排序後杯子 | x 計算 | 輸出 |
|---|---|---|---|
| 2 4 1 1 1 1 | 1 1 1 1 | min(1, 1/2, 4/6) = 0.5 | 3 |
| 3 18 4 4 4 2 2 2 | 2 2 2 4 4 4 | min(2, 4/2, 18/9) = 2 | 18 |
| 1 5 2 3 | 2 3 | min(2, 3/2, 5/3) = 1.5 | 4.5 |
將較小的杯子分給需水量較少的女生,較大的杯子分給男生,這樣能最大化 x 的上限。若反向分配,男生的 2x 會受限於較小杯子,導致整體總量下降。