当前位置:   article > 正文

(算法)区间调度问题

(算法)区间调度问题

               问题大致如下所述:有n项工作,每项工作分别在s时间开始,在t时间结束. 对于每项工作,你都可以选择参与与否,如果选择了参与,那么自始至终都必须全程参与.    
        此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).  你的目标是参与尽王多的工作,那么最多能参与多少项工作呢?

        问题解决思路:通过排序确定从小到大的开始时间,如选择第一个工作,即看事件谁的结束时间最小。再次选择下一个工作(即第二个工作),则判断第一个工作结束时间必须大于第二个工作开始时间,且结束时间小的先安排上。如此类推。

代码:

  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3. public class qujian {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. int n = sc.nextInt();
  7. int[] s = new int[n]; //创建两个数组 s 和 t,分别存储每个任务的开始时间和结束时间
  8. int[] t = new int[n];
  9. Job[] jobs = new Job[n]; //创建一个 Job 数组 jobs,将每个任务的开始时间和结束时间封装成 Job 对象,方便进行排序。
  10. for (int i = 0; i < n; i++) {
  11. s[i] = sc.nextInt();
  12. }
  13. for (int i = 0; i < n; i++) {
  14. t[i] = sc.nextInt();
  15. }
  16. for (int i = 0; i < n; i++) {
  17. jobs[i] = new Job(s[i], t[i]);
  18. }
  19. Arrays.sort(jobs);
  20. int res = f(n, jobs);
  21. System.out.println(res);
  22. }
  23. private static int f(int n, Job[] jobs) {
  24. int cnt = 1;
  25. int y = jobs[0].t; // y 为当前任务的结束时间
  26. for (int i = 0; i < n; i++) {
  27. if (jobs[i].s > y) {
  28. cnt++; //如果当前任务的开始时间大于 y,则说明可以完成这个任务,
  29. // cnt 加 1,并更新 y 为当前任务的结束时间
  30. y = jobs[i].t;
  31. }
  32. }
  33. return cnt;
  34. }
  35. private static class Job implements Comparable<Job> {
  36. int s;
  37. int t;
  38. public Job(int s, int t) {
  39. this.s = s;
  40. this.t = t;
  41. }
  42. @Override
  43. public int compareTo(Job other) {
  44. int x = this.t - other.t;
  45. if (x == 0)
  46. return this.s - other.s;
  47. else
  48. return x;
  49. }
  50. }
  51. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/864253
推荐阅读
相关标签
  

闽ICP备14008679号