奶牛用餐 优先队列 java

这篇具有很好参考价值的文章主要介绍了奶牛用餐 优先队列 java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

👨‍🏫 奶牛用餐

约翰的农场有 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 头奶牛用餐完毕的具体时刻。

数据范围

3 3 3 个测试点满足 1 ≤ n ≤ 10 1 \le n \le 10 1n10
所有测试点满足 1 ≤ n , k ≤ 5 × 1 0 5 1 \le n,k \le 5 \times 10^5 1n,k5×105 1 ≤ s i , t i ≤ 1 0 9 1 \le s_i,t_i \le 10^9 1si,ti109文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 第十七章 优先队列优化Dijkstra算法

    第十七章 优先队列优化Dijkstra算法

    作者在这里建议,不太懂dijkstra算法的同学可以去看看作者对该算法的详细讲解以及通俗证明,这样大家就能够体会到原算法的缺陷。 传送门:第十六章 Dijkstra算法的讲解以及证明(与众不同的通俗证明) 我们的dijkstra算法会选出所有松弛后所得距离的最小值。而我们之前的

    2023年04月25日
    浏览(11)
  • 数据结构与算法-优先级队列

    Gitee上开源的数据结构与算法代码库:数据结构与算法Gitee代码库 优先级队列,按照优先级别依次输出 计算机科学中,堆是一种基于树的数据结构,通常用 完全二叉树 实现。堆的特性如下 在大顶堆中,任意节点 C 与它的父节点 P 符合 P . v a l u e ≥ C . v a l u e P.value geq C.val

    2024年02月13日
    浏览(30)
  • 【算法题解】23. 「滑动窗口最大值」单调队列解法

    【算法题解】23. 「滑动窗口最大值」单调队列解法

    这是一道 困难 题 题目来自:https://leetcode.cn/problems/sliding-window-maximum/ 给你一个整数数组 nums ,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 示

    2023年04月11日
    浏览(10)
  • 算法沉淀——优先级队列(堆)(leetcode真题剖析)

    算法沉淀——优先级队列(堆)(leetcode真题剖析)

    优先队列(Priority Queue)是一种抽象数据类型,它类似于队列(Queue),但是每个元素都有一个关联的优先级。在优先队列中,元素按照优先级从高到低(或从低到高)排列,高优先级的元素先出队。这种数据结构可以用堆(Heap)来实现。 堆是一种二叉树结构,有两种主要类

    2024年02月22日
    浏览(16)
  • 49天精通Java,第27天,队列、双端队列、优先队列

    49天精通Java,第27天,队列、双端队列、优先队列

    大家好,我是哪吒。 双端队列是一种特殊的队列,它的两端都可以进行插入和删除操作。这种队列的实现方式是使用两个指针,一个指针指向队列的头部,另一个指针指向队列的尾部。当需要插入或删除元素时,只需要移动指针即可。

    2024年02月03日
    浏览(14)
  • 【一起学习数据结构与算法】优先级队列(堆)

    【一起学习数据结构与算法】优先级队列(堆)

    如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了 优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集

    2024年01月19日
    浏览(12)
  • 【JAVA】优先级队列(堆)

    【JAVA】优先级队列(堆)

    羡慕别人就让自己变得更好! 优先级队列(堆)可用于topK问题 有大小根堆 注意堆的模拟实现 坚持真的很难但是真的很酷! 队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列。 此时,数据结

    2024年02月15日
    浏览(11)
  • Java优先级队列-堆

    大家好,我是晓星航。今天为大家带来的是 Java优先级队列(堆) 的讲解!😀 使用数组保存二叉树结构,方式即将二叉树用 层序遍历 方式放入数组中。 一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。 这种方式的主要用法就是堆的表示。 已知双亲(parent)的下

    2023年04月16日
    浏览(11)
  • 【算法】优先队列式分支限界法,以01背包问题为例

    【算法】优先队列式分支限界法,以01背包问题为例

    题目链接:采药-洛谷 当洛谷上不让下载测试用例,可以试试:采药-ACWing 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞

    2024年02月02日
    浏览(10)
  • java 堆(优先级队列)详解

    java 堆(优先级队列)详解

    如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki = K2i+1 且 Ki= K2i+2 (Ki = K2i+1 且 Ki = K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小

    2024年02月08日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包