👨🏫 奶牛用餐
约翰的农场有 n n n 头奶牛,编号 1 s i m n 1 \\sim n 1simn。
每天奶牛们都要去食堂用餐。
食堂一共有 k k k 个座位,也就是说同一时间最多可以容纳 k k k 头奶牛同时用餐。
已知,第 i i i 头奶牛到达食堂的具体时刻为 s _ i s\_i s_i,用餐所需花费的时间为 t _ i t\_i t_i。
保证 s _ 1 < s _ 2 < … < s _ n s\_1 < s\_2 < … < s\_n s_1<s_2<…<s_n。
为了让奶牛们有序用餐,约翰制定了如下规则:
- 每头奶牛都必须由约翰安排座位用餐。
- 每头奶牛从到达食堂的那一刻起,即刻进入待安排状态。
- 任意时刻,只要存在空座位以及待安排奶牛,约翰就会即刻安排奶牛就座用餐。
- 如果某一时刻,空座位的数量少于待安排奶牛的数量,则优先安排编号更小的奶牛就座用餐。
- 每头奶牛用餐完毕的那一时刻都会被约翰立即轰走,即刻空出座位。
除了用餐花费时间以外,其它花费时间忽略不计。
请你计算并输出,每头奶牛用餐完毕的具体时刻。
输入格式
第一行包含两个整数 n , k n,k n,k。
接下来 n n n 行,其中第 i i i 行包含两个整数 s _ i , t _ i s\_i,t\_i s_i,t_i。
注意,输入保证 s _ 1 < s _ 2 < … < s _ n s\_1 < s\_2 < … < s\_n s_1<s_2<…<s_n。
输出格式
共 n n n 行,每行输出一个整数,其中第 i i i 行的整数表示第 i i i 头奶牛用餐完毕的具体时刻。文章来源:https://www.toymoban.com/news/detail-643784.html
数据范围
前
3
3
3 个测试点满足
1
≤
n
≤
10
1 \le n \le 10
1≤n≤10。
所有测试点满足
1
≤
n
,
k
≤
5
×
1
0
5
1 \le n,k \le 5 \times 10^5
1≤n,k≤5×105,
1
≤
s
i
,
t
i
≤
1
0
9
1 \le s_i,t_i \le 10^9
1≤si,ti≤109。文章来源地址https://www.toymoban.com/news/detail-643784.html
输入样例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
import java.io.*;
import java.util.*;
public class Main
{
static int N = 500050;
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException
{
// Scanner sc = new Scanner(System.in);
// int n = sc.nextInt();
// int m = sc.nextInt();
String[] ss = in.readLine().split(" ");
int n = Integer.parseInt(ss[0]);
int m = Integer.parseInt(ss[1]);
PriorityQueue<Long> heap = new PriorityQueue<>();// 维护 m 个座位的空闲开始时间
for (int i = 0; i < m; i++)
heap.add(0L);// 座位的空闲时间初始化为 0
while (n-- > 0)
{
// long start = sc.nextLong();
// long time = sc.nextLong();
ss = in.readLine().split(" ");
long start = Long.parseLong(ss[0]);
long time = Long.parseLong(ss[1]);
long t = heap.poll();// 每次获取最快有空位的时间
long end = Math.max(start, t) + time;// 和自身的到达时间取 max 值
heap.add(end);// 把此座位的下一次空位时刻加入 堆
System.out.println(end);
}
}
}
到了这里,关于奶牛用餐 优先队列 java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!