1 条题解

  • 0
    @ 2024-11-1 8:45:26

    考察二分答案和队列。

    由于座位数量一定是越多越好,越多就能容纳更多的客人。所以本题支持二分答案,即座位数。

    二分答案之后,由于客人讲究先来后到,这和队列的内核相同,所以我们可以使用队列来模拟客人到来的过程。

    队列中的元素就是客人,元素的值就是客人的离开时间。客人进入时,首先观察队列中的元素数是否超过座位数,超过的话说明座位满了,这种情况我们就拿出队头元素,因为最先进入店里的人最早走,以他的时间作为当前顾客进店用餐的时间。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 5;
    int a[maxn], b[maxn], n, m;
    bool check(int mid){ // mid 是空位数
    	queue<int>q;
    	for(int i = 1; i <= n; i++){
    		if(q.size() < mid){ // 有空位,直接进入
    			q.push(a[i] + m);
    		}else{
    			int now = q.front(); // 拿出第一个人的离开时间作为当前顾客的进入时间
    			q.pop();
    			if(now - a[i] > b[i])	return false; // 等待时间过长返回 false
    			q.push(now + m); // 当前顾客在 now 进入,在 now + m 离开
    		}
    	}
    	return true;
    }
    int main(){
    	cin >> n >> m;
    	for(int i = 1; i <= n; i++){
    		cin >> a[i] >> b[i];
    	}
    	int l = 1, r = n, ans;
    	while(l <= r){
    		int mid = (l + r) / 2;
    		if(check(mid)){
    			ans = mid;
    			r = mid - 1;
    		}else{
    			l = mid + 1;
    		}
    	}
    	cout << ans << endl;
    }
    
    • 1

    信息

    ID
    22
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    40
    已通过
    4
    上传者