1 条题解
-
0
考察二分答案和队列。
由于座位数量一定是越多越好,越多就能容纳更多的客人。所以本题支持二分答案,即座位数。
二分答案之后,由于客人讲究先来后到,这和队列的内核相同,所以我们可以使用队列来模拟客人到来的过程。
队列中的元素就是客人,元素的值就是客人的离开时间。客人进入时,首先观察队列中的元素数是否超过座位数,超过的话说明座位满了,这种情况我们就拿出队头元素,因为最先进入店里的人最早走,以他的时间作为当前顾客进店用餐的时间。
#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
- 上传者