贪心 + 优先队列:程序员PIPI

我会带着你远行 2023-10-06 20:24 118阅读 0赞

贪心 + 优先队列:程序员PIPI

文章目录

  • 贪心 + 优先队列:程序员PIPI
      • 问题:
      • 思路:
      • 代码:

问题:

在这里插入图片描述
在这里插入图片描述

思路:

  本题实际上是要我们在坐标轴上找到区间重叠最多的那一段有多少个区间。
  我们可以将进程按开始时间从小到大排序,我们的贪心策略是让一个计算机处理尽可能多的进程,为了达到这一目的,我们要让每个计算机的空闲时间尽可能少,即完成一个进程后尽快处理下一个进程,因此我们需要知道正在处理进程的所有计算机中,最早完成任务的计算机的完成时间,即正在被处理的进程的最早结束时间。若当前需要被处理的进程的开始时间大于等于正在被处理的进程的最早结束时间,则可以让这个最早完成任务的计算机来处理当前进程。
  我们用一个优先队列来记录在所有处理进程的计算机中,最早处理完的时间(即进程的最早结束时间)。我们遍历进程,按以下情况进行不同处理:
  1、当前优先队列为空,说明我们还没有使用任意一台计算机,我们开始使用第一台计算机处理当前进程,将当前进程的结束时间加入优先队列,机器数+1
  2、当前进程的开始时间小于堆顶元素(即优先队列头)的结束时间,即当前区间与堆顶元素代表的区间有重叠,也就是需要使用一台新计算机来处理它,当前进程不能重用计算机,于是我们使用一台新计算机处理它,将当前进程的结束时间加入优先队列,机器数+1
  3、当前进程的开始时间大于等于堆顶元素的结束时间,那么证明之后的所有区间(进程)都不会与堆顶元素所代表的区间重叠了,因此我们可以将堆顶元素弹出来,相当于将堆顶元素(进程)占用的计算机匀给了当前区间(进程),然后我们将当前区间(进程)的结束时间加入堆。
  举个例子:
在这里插入图片描述

代码:

  1. import java.util.*;
  2. public class Main {
  3. static Pro[] array = new Pro[100002];
  4. static Queue<Integer> q = new PriorityQueue<>();
  5. public static void main(String[] args) {
  6. int n, s, t, i, ans;
  7. Scanner scanner = new Scanner(System.in);
  8. while (scanner.hasNextInt()) {
  9. n = scanner.nextInt();
  10. ans = 0;
  11. q.clear();
  12. for (i = 0;i < n;i++) {
  13. s = scanner.nextInt();
  14. t = scanner.nextInt();
  15. array[i] = new Pro(s, t);
  16. }
  17. Arrays.sort(array, 0, n, new Comparator<Pro>() {
  18. @Override
  19. public int compare(Pro o1, Pro o2) {
  20. return o1.s - o2.s;
  21. }
  22. });
  23. for (i = 0;i < n;i++) {
  24. if (q.isEmpty()) {
  25. ans++;
  26. q.add(array[i].t);
  27. } else if (array[i].s < q.peek()) {
  28. ans++;
  29. q.add(array[i].t);
  30. } else {
  31. q.poll();
  32. q.add(array[i].t);
  33. }
  34. }
  35. System.out.println(ans);
  36. }
  37. }
  38. }
  39. class Pro {
  40. public int s;
  41. public int t;
  42. public Pro (int s, int t) {
  43. this.s = s;
  44. this.t = t;
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,118人围观)

还没有评论,来说两句吧...

相关阅读

    相关 51nod 1163 (贪心+优先队列

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的

    相关 51nod 1191(贪心+优先队列)

    有N只兔子,每只有一个血量B\[i\],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D\[i\],价格为P\[i\](1 <= i <= M)。假设