解决思路
- 检查函数:定义一个检查函数 check(mid),判断在舞台大小为 mid 时,演出是否能在 T_max 时间内完成。
- 优先队列:使用优先队列模拟舞台上的奶牛,确保每次有奶牛完成表演时,下一头奶牛立即上台。
- 更新边界:根据检查函数的结果,更新二分查找的边界,直到找到最小的 K。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
int n, a[N], t;
// 检查在舞台大小为 mid 时,演出是否能在 T_max 时间内完成
bool check(int mid) {
priority_queue<int, vector<int>, greater<int>> q;
for (int i = 1; i <= mid; i++) q.push(a[i]);
for (int i = mid + 1; i <= n; i++) {
int minn = q.top(); q.pop();
q.push(minn + a[i]); // 新加入队列的 a[i] 必须是 top() 结束后加入的,而 top() 跳了 minn 时长
}
while (q.size() > 1) q.pop(); // 全部弹出,队列的最后一人就是整个队伍的跳舞时长
return q.top() <= t;
}
int main() {
// 读取奶牛数量和演出可进行的最长时间
cin >> n >> t;
for (int i = 1; i <= n; i++) cin >> a[i];
int L = 1, R = n, ans = n;
while (L <= R) {
int mid = (L + R) >> 1;
if (check(mid)) {
ans = mid;
R = mid - 1;
} else {
L = mid + 1;
}
}
cout << ans;
return 0;
}