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

本文介绍了如何使用贪心算法在Java中解决活动安排问题,以在最短时间内安排尽可能多的活动。通过实现Activity类和ActivityPlan类,根据活动结束时间非递减排序并判断活动的开始时间是否在前一个活动的结束时间之后,实现活动的合理安排。代码示例展示了如何安排一组活动。
摘要由CSDN通过智能技术生成

贪心法描述:

贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

问题描述:

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

代码如下:

Activity类用于封装活动对象,包括活动的开始时间和结束时间,另外实现了Comparable接口,用于按照结束时间非递减排序

public class Activity implements Comparable {

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

return endHour>targetEndHour?1:(endHour

}

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 res=new ArrayList();

public List layout(Iterator 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

int j=preHour>thisHour?-1:(preHour

return j>=0;

}

}

Main类用于代码测试

public class Main {

public static void main(String[] args) {

Set activitys=new TreeSet();

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 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值