问题表述:
假设有N个活动,每个活动都需要用到会场,而会场只有一个,且同一时间只能有一个活动在会场举办。我们的目的就是尽可能多地安排活动。
每个活动i都对应这一个初始时间si和fi,在时间段[si,fi)内,活动i占有场地,我们要想安排活动j,它必须满足sj >= fi或者si >= fj.
例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
si | 1 | 3 | 0 | 5 | 3 | 5 | 6 | 8 | 8 | 2 | 12 |
fi | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
接下来为Java的实现代码:
public class Main {
public static void main(String[] args){
//所有活动
Activity [] activity = new Activity[11];
//选择的活动
List<Activity> selectedActivity = new ArrayList<Activity>();
//初始化所有的活动,这里需要注意的是:为了简便易懂,我这里直接将活动的结束时间排序好,不然的话,要对所有活动的结束时间进行排序
activity[0] = new Activity(1,4);
activity[1] = new Activity(3,5);
activity[2] = new Activity(0,6);
activity[3] = new Activity(5,7);
activity[4] = new Activity(3,8);
activity[5] = new Activity(5,9);
activity[6] = new Activity(6,10);
activity[7] = new Activity(8,11);
activity[8] = new Activity(8,12);
activity[9] = new Activity(2,13);
activity[10] = new Activity(12,14);
//把第一个活动假如选择的活动中(因为结束时间是最短的)
selectedActivity.add(activity[0]);
//遍历剩余的活动,找到适合的活动假如选择活动中
for(int i=1;i<activity.length;i++){
//获取到选择活动的最后一个活动(因为它的活动结束时间是最晚)
Activity a = selectedActivity.get(selectedActivity.size()-1);
Activity aa = activity[i];
if(aa.getStartTime() >= a.getFinishTime() || aa.getFinishTime() <= a.getStartTime()){
selectedActivity.add(aa);
}
}
for(int i=0;i<selectedActivity.size();i++){
System.out.println(selectedActivity.get(i).getStartTime()
+ "开始, " + selectedActivity.get(i).getFinishTime() + "结束");
}
}
}
public class Activity{
//开始时间
private int startTime;
//结束时间
private int finishTime;
public Activity() {
}
public Activity(int startTime,int finishTime){
this.startTime = startTime;
this.finishTime = finishTime;
}
public int getStartTime(){
return startTime;
}
public int getFinishTime(){
return finishTime;
}
}