区间调度或者说相交区间

区间调度或者说相交区间(贪心)

/*
有n项工作,每项工作分别在si时间开始,在ti时间结束.
对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.
此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).
你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?
1≤n≤100000
1≤si≤ti≤10^9
输入:
第一行:n
第二行:n个整数空格隔开,代表n个工作的开始时间
第三行:n个整数空格隔开,代表n个工作的结束时间
样例输入:
5
1 3 1 6 8
3 5 2 9 10
样例输出:
3
说明:选取工作1,3,5
*/

package _90贪心;

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

//注意问题: 1就是分析以结束时间开始记  2就是排序不能乱要实现面向对象
public class 区间调度或者说相交区间 {
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];
     for(int i=0;i<n;i++) {
    	 s[i]=sc.nextInt();
     }
     for(int j=0;j<n;j++) {
    	 t[j]=sc.nextInt();
     }
     Job[] jobs=new Job[n];//创建对象
     for(int i=0;i<n;i++) {
    	 jobs[i]=new Job(s[i],t[i]);  //把值传入对象
     }
     Arrays.sort(jobs);//进行排序
   
     int res=f(n,jobs);//把对象 和n传入静态方法当中
     System.out.println(res);           
}
private static int f(int n, Job[] jobs) {
	// TODO Auto-generated method stub
	int cnt=1;//计数
	int y=jobs[0].t;//末尾时间
	for(int i=0;i<n;i++) {
		if(jobs[i].s>y) {//头大于尾
			cnt++;
			y=jobs[i].t;
		}
	}
	return cnt;
}
private static 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 o) {//方法
		// TODO Auto-generated method stub
       int x=this.t-o.t;//区间终点从小到大的排序
       if(x==0) {
    	   return this.s-o.s;
       }else {
    	   return x;
       }		
	}
 }
}
//java.lang.NullPointerException
//应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括: 

猜你喜欢

转载自blog.csdn.net/weixin_45952706/article/details/107922885