优先队列-牛奶用餐

5135. 奶牛用餐 - AcWing题库

约翰的农场有 n 头奶牛,编号 1∼n。

每天奶牛们都要去食堂用餐。

食堂一共有 k 个座位,也就是说同一时间最多可以容纳 k 头奶牛同时用餐。

已知,第 i 头奶牛到达食堂的具体时刻为 si,用餐所需花费的时间为 ti。

保证 s1<s2<…<sn。

为了让奶牛们有序用餐,约翰制定了如下规则:

  • 每头奶牛都必须由约翰安排座位用餐。
  • 每头奶牛从到达食堂的那一刻起,即刻进入待安排状态。
  • 任意时刻,只要存在空座位以及待安排奶牛,约翰就会即刻安排奶牛就座用餐。
  • 如果某一时刻,空座位的数量少于待安排奶牛的数量,则优先安排编号更小的奶牛就座用餐。
  • 每头奶牛用餐完毕的那一时刻都会被约翰立即轰走,即刻空出座位。

除了用餐花费时间以外,其它花费时间忽略不计。

请你计算并输出,每头奶牛用餐完毕的具体时刻。

输入格式

第一行包含两个整数 n,k。

接下来 n 行,其中第 i 行包含两个整数 si,ti。

注意,输入保证 s1<s2<…<sn。

输出格式

共 n 行,每行输出一个整数,其中第 i 行的整数表示第 i 头奶牛用餐完毕的具体时刻。

数据范围

前 33 个测试点满足 1≤n≤10。
所有测试点满足 1≤n,k≤5×105,1≤si,ti≤109。

输入样例1:
3 2
1 5
2 5
3 5
输出样例1:
6
7
11
输入样例2:
6 1
1 1000000000
2 1000000000
3 1000000000
4 1000000000
5 1000000000
6 3
输出样例2:
1000000001
2000000001
3000000001
4000000001
5000000001
5000000004

奶牛按顺序到达,到达后给每头奶牛安排座位,有空余位置则给奶牛安排,没空位置则奶牛等待,此时等待的奶牛则安排最早结束的位置,如果有多个空位,则可以安排任意位置,我们也安排最早结束的位置,所以直接优先队列模拟餐位,每次从队列中取出最早结束的空位时间,也就是最小值,然后计算该座位吃完饭后的时间,然后再放入队列中。优先队列自动对集合中的数据排序,维护最小值,所以直接通过优先队列模拟

AC code:

#include<bits/stdc++.h>
using namespace std;
int n, k;
int s[500010], t[500010];
priority_queue<long long, vector<long long>, greater<long long>> m;
int main() {
	cin >> n >> k;
	for (int i = 1; i <= k; i++)  m.push(0);

	while (n--) {
		long long s, t;
		cin >> s >> t;
		long long x = m.top();
		m.pop();
		x = max(x, s) + t;
		cout << x << endl;
		m.push(x);
	}

}

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值