给定开始时间start和结束结束时间end,给定一组任务列表(t1, t2)表示每个任务的起始时间和结束时间。其中每个任务必须按照规定时间执行,不能有重合,设计一个调度算法,使start到end时间内执行任务个数最多。
可以使用贪心策略,先选取第一个任务,第一个任务应该具有什么特征才能使总任务数最多。第一次,想的是任务的起始时间最小的,尽管起始时间可能最小,然而可能任务结束时间也晚,这样中间一段时间可能执行更多的任务,因此不对。其实应该按照任务的结束时间最小来选取,当选取第一个任务为结束时间最小时,后面可以剩余更多时间来选取其他任务,其实当选取一个任务时,相当于更新start=选取任务的结束时间,这样便转换为一个子问题。
package util;
import java.util.Arrays;
import java.util.Comparator;
public class Study3 {
static class Time{
int start;
int end;
public Time(int start, int end){
this.start = start;
this.end = end;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[" + start + "," + end + "]";
}
}
static class TimeComparator implements Comparator<Time>{
@Override
public int compare(Time o1, Time o2) {
return o1.end - o2.end;
}
}
public static int maxTask(Time[] tt, int start, int end){
//以结束时间升序排序
Arrays.sort(tt, new TimeComparator());
System.out.println(Arrays.toString(tt));
int num = 0;
for(int i=0; i<tt.length; i++){
//满足条件,则先执行,start更新为执行任务的结束时间
if(tt[i].start>=start && tt[i].end<=end){
num++;
start = tt[i].end;
}
}
return num;
}
public static void main(String[] args) {
Time[] tt = new Time[]{new Time(1,3), new Time(1,9), new Time(2,4), new Time(3,6), new Time(6,7), new Time(4,8)};
System.out.println(maxTask(tt, 0, 10));
}
}
可以使用Arrays.sort方法自定义比较器来对对象进行比较排序,具体来说根据每个对象的end字段升序排序。
使用Arrays对于对象排序可以使用
1.对象实现Comparable接口
2.使用Comparator比较器
对象实现Comparable方式如下:
public class Study3 {
static class Time implements Comparable<Time>{
int start;
int end;
public Time(int start, int end){
this.start = start;
this.end = end;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[" + start + "," + end + "]";
}
@Override
public int compareTo(Time o) {
return this.end - o.end;
}
}
public static int maxTask(Time[] tt, int start, int end){
//以结束时间升序排序
Arrays.sort(tt);
System.out.println(Arrays.toString(tt));
int num = 0;
for(int i=0; i<tt.length; i++){
//满足条件,则先执行,start更新为执行任务的结束时间
if(tt[i].start>=start && tt[i].end<=end){
num++;
start = tt[i].end;
}
}
return num;
}
public static void main(String[] args) {
Time[] tt = new Time[]{new Time(1,3), new Time(1,9), new Time(2,4), new Time(3,6), new Time(6,7), new Time(4,8)};
System.out.println(maxTask(tt, 0, 10));
}
}