www.luogu.com.cn
题目大意:
有一个队列,其中的每项工作 i 都有两个值:最早可以处理的时间 ti 和处理所需要的时间 di,等待队列中的数量不可以超过 b,求出每个工作完成时间(无法完成则输出 −1)。
模拟思路
这是一道结合了队列的模拟题,自然可以使用 queue 来做,但首先我们要搞清一下几点:
-
如何判断当前时间点有多少件事情可以完成。
-
如何根据队列中的等待数判断是否可以完成。
-
如何计算下一个事情前的完成时间。
我们可以定义一个一维数组 bg[N],其中 bgi 表示第 i 个事情时最早的可以做的时间,而由于每个事情都有自己的最早可处理时间 ti,因此 max(bgi−1,ti) 即为第 i 个事情的实际开始时间。显然可以得出转移方程:
bgi=max(bgi−1+di−1,ti)
有因为一维数组 bgi 的状态只和 bgi−1 有关,所以我们可以直接使用一个变量来代替。
不多说了,看代码注释。
STL代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 9;
queue<ll> q; ll t[N], d[N]; ll bg_time, n, b; int main() { cin >> n >> b; for (int i = 1; i <= n; i++) cin >> t[i] >> d[i]; for (int i = 1; i <= n; i++) { while (!q.empty() && q.front() <= t[i]) q.pop(); if (q.size() <= b) { bg_time = max(bg_time, t[i]) + d[i]; cout << bg_time << ' '; q.push(bg_time); } else cout << -1 << ' '; } return 0; }
|