区间调度或者说相交区间(贪心)
/*
有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 时,抛出该异常。这种情况包括: