題目要求:將面試者按順序分組,每組錄取一人,找到最小分組數使得錄取能力總和超過 K。N ≤ 200,000。
貪心驗證邏輯:
bool check(int groups) {
int len = n / groups; // 基礎組長
int rem = n % groups; // 前 rem 組多 1 人
long long sum = 0;
int pos = 0;
for (int i = 0; i < groups; ++i) {
int curLen = len + (i < rem ? 1 : 0);
int maxVal = rmq_query(pos, pos + curLen - 1); // 區間最大值
sum += maxVal;
if (sum >= K) return true;
pos += curLen;
}
return false;
}
int dp[MAXN][LOGN]; // dp[i][j] 表示從 i 開始長度 2^j 的區間最大值
void RMQ_init() {
for (int i = 1; i <= n; ++i) dp[i][0] = a[i];
for (int j = 1; (1<
此題結合了二分答案、貪心分組策略與 RMQ 區間查詢,是區間最值數據結構在優化決策問題中應用的典型案例。