区间调度问题

问题描述:

        有n项工作,每项工作分别在si开始,ti结束。对每项工作,你都可以选择参加或不参加,但选择了参加某项工作就必须至始至终参加全程参与,即参与工作的时间段不能有重叠(即使开始的时间和结束的时间重叠都不行)。

样例:

      输入

     n=5

     s={1,2,4,6,8}

     T={3,5,7,9,10}

输出

      3(选择工作1, 3, 5)

 分析:这一题用到贪心算法的思想,就是每次选取结束时间最早的,从局部上达到最优,实际上整体也是最优的。

        我们需要对数据进行排序,排序的目的是使结束时间短的排在前面.这一点我们可以利用Java中的对象进行封装,然后利用Arrays.sort进行排序,但是我们需要定义排序规则,开始时间相同的时候,比较结束时间。

排序前:

排序后:

这样进行一次遍历,每次将上一个结束时间和下一个的开始时间进行比较,如果下一个的开始时间大于上一个的结束时间,那么次数就加1,例如:第一次结束时间是2,但是下一个开始时间是1,这说明两个时间重叠了,我们就跳过,继续进行遍历,直到循环结束。

代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class Job implements Comparable<Job>{
    int s;//开始时间
    int t;//结束时间
    public Job(int s, int t) {
        this.s = s;
        this.t = t;
    }
    @Override
    public int compareTo(Job other) {//自定义比较规则,返回值为负数,就是升序排序
        int x=this.t-other.t;
        if (x==0)return this.s-other.s;
        else return x;
    }
}
class Text1{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] s=new int[n];
        int[] t=new int[n];
        Job[] jobs=new Job[n];
        for (int i = 0; i < n; i++) {
            s[i]=sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            t[i]=sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            jobs[i]=new Job(s[i],t[i]);
        }
        Arrays.sort(jobs);
        int res=f(n,jobs);
        System.out.println(res);
    }
    private static int f(int n,Job[] jobs){
        int cnt=1;
        int y=jobs[0].t;
        for (int i = 1; i < n; i++) {
            if (jobs[i].s>y){
                cnt++;
                y=jobs[i].t;
            }
        }
    return cnt;
    }
}

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值