贪心法求解活动安排(java实现)

贪心法描述:
贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

问题描述:
现有一组活动由你安排,但要求你在最短的时间内安排尽可能多的活动。

代码如下:
Activity类用于封装活动对象,包括活动的开始时间和结束时间,另外实现了Comparable接口,用于按照结束时间非递减排序
public class Activity implements Comparable<Activity> {
	private String startTime;//活动开始时间
	private String endTime;//活动结束时间
	public Activity(String startTime,String endTime){
		this.startTime=startTime;
		this.endTime=endTime;
	}
	/**
	 * 按照活动结束时间非递减排序
	 */
	@Override
	public int compareTo(Activity obj) {
		String targetEndTime=obj.getEndTime();
		int endHour=Integer.parseInt(endTime.split(":")[0]);
		int endMin=Integer.parseInt(endTime.split(":")[1]);
		int targetEndHour=Integer.parseInt(targetEndTime.split(":")[0]);
		int targetEndMin=Integer.parseInt(targetEndTime.split(":")[1]);
		int i=endMin>targetEndMin?1:(endMin<targetEndMin?-1:0);
		return endHour>targetEndHour?1:(endHour<targetEndHour?-1:(i));
	}
	public String getStartTime() {
		return startTime;
	}
	public void setStartTime(String startTime) {
		this.startTime = startTime;
	}
	public String getEndTime() {
		return endTime;
	}
	public void setEndTime(String endTime) {
		this.endTime = endTime;
	}
	@Override
	public String toString() {
		return startTime + "~" + endTime;
	}
}
ActivityPlan类为具体的执行类,通过其layout方法来安排活动
public class ActivityPlan {
	List<Activity> res=new ArrayList<Activity>();
	public List<Activity> layout(Iterator<Activity> activities){
		if(!activities.hasNext()){
			return res;
		}
		Activity activity=activities.next();
		int size=res.size();
		if(size==0){
			res.add(activity);
		}else{
			Activity preActivity=res.get(size-1);
			String preEndTime=preActivity.getEndTime();
			String thisStartTime=activity.getStartTime();
			if(legal(preEndTime,thisStartTime)){
				res.add(activity);
			}
		}
		return layout(activities);
	}
	/**
	 * 当前活动的开始时间是否在上一个活动的结束时间之后
	 */
	private boolean legal(String preEndTime, String thisStartTime) {
		int preHour=Integer.parseInt(preEndTime.split(":")[0]);
		int preMin=Integer.parseInt(preEndTime.split(":")[1]);
		int thisHour=Integer.parseInt(thisStartTime.split(":")[0]);
		int thisMin=Integer.parseInt(thisStartTime.split(":")[1]);
		int i=preMin>thisMin?-1:(preMin<thisMin?1:0);
		int j=preHour>thisHour?-1:(preHour<thisHour?1:(i));
		return j>=0;
	}
}
Main类用于代码测试
public class Main {
	public static void main(String[] args) {
		Set<Activity> activitys=new TreeSet<Activity>();
		activitys.add(new Activity("9:30","10:30"));
		activitys.add(new Activity("7:30","8:50"));
		activitys.add(new Activity("10:40","11:30"));
		activitys.add(new Activity("8:00","10:30"));
		activitys.add(new Activity("8:30","11:40"));
		activitys.add(new Activity("10:30","12:30"));
		ActivityPlan plan=new ActivityPlan();
		List<Activity> res=plan.layout(activitys.iterator());
		for(Activity activity:res){
			System.out.print("\t"+activity);
		}
	}
}
程序输出:7:30~8:50    9:30~10:30    10:40~11:30
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值