算法3--设计调度算法使规定时间内执行任务最多--贪心策略

       给定开始时间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));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值