Codeforces 557A 經典貪心問題:n 位參賽者需分配一、二、三等獎狀,每等級有最小/最大數量限制,優先最大化一等獎數量,其次二等、三等。
n (3 ≤ n ≤ 3×10⁶)min[i] ≤ count[i] ≤ max[i]Σmin[i] ≤ n ≤ Σmax[i]ans[i] = min[i]rem = n - Σmin[i]for (int i = 1; i <= 3; ++i) {
int can_add = min(rem, max[i] - min[i]);
ans[i] += can_add;
rem -= can_add;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
int mn[4], mx[4], ans[4];
for (int i = 1; i <= 3; ++i) {
cin >> mn[i] >> mx[i];
}
for (int i = 1; i <= 3; ++i) {
ans[i] = mn[i];
n -= mn[i];
}
for (int i = 1; i <= 3; ++i) {
int add = min(n, mx[i] - mn[i]);
ans[i] += add;
n -= add;
}
cout << ans[1] << ' ' << ans[2] << ' ' << ans[3] << '\n';
return 0;
}
| 輸入 | 最小值分配 | 剩餘分配 | 最終結果 |
|---|---|---|---|
| 6 1 5 2 6 3 7 | 1,2,3 (sum=6) | rem=0 | 1 2 3 |
| 10 1 2 1 3 1 5 | 1,1,1 (sum=3) | rem=7→ 一等+1, 二等+2, 三等+4 | 2 3 5 |
| 6 1 3 2 2 2 2 | 1,2,2 (sum=5) | rem=1→ 一等+1 | 2 2 2 |
由於優先序固定且約束為區間,貪心策略在每一步都做出局部最優選擇:優先將剩餘資源分配給最高優先級且未達上限的等級。此問題具有「貪心選擇性質」與「最優子結構」,貪心解即全域最優解。