2520 牛的舞蹈表演 二分答案 优先队列

解决思路

 
  • 二分查找:使用二分查找来确定舞台的最小大小 K。

 

  • 检查函数:定义一个检查函数 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;
}

 

posted @ 2024-09-30 17:18  CRt0729  阅读(6)  评论(0编辑  收藏  举报