/**
* Created by april on 2018/8/13.
* https://blog.csdn.net/ustcyy91/article/details/72716609
* 给定N个活动,以及它们的开始时间和结束时间,求N个活动中,最大兼容的活动个数。比如:
活动 i: 1 2 3 4.....
开始时间 si: 1 3 0 5....
结束时间 fi: 4 5 6 7.....
活动1的开始时间s(1)=1,结束时间f(1)=4,它与活动2是不兼容的。因为,活动1还没有结束,活动2就开始了(s(2) < f(1))
活动2 与 活动4 是兼容的。因为,活动2的进行区间是[3,5) 而活动4的进行区间是[5,7)
目标是:在N个活动中,找出最大兼容的活动个数。
*/
/*
贪心算法:每次在做选择时,总是先选择具有相同特征的那个解,在这里,“贪心”的那个解则是: 结束时间最早的那个活动
具体步骤:
第一步:先对活动按照结束时间进行排序。因为我们总是优先选择结束时间最早的活动的嘛。排序之后,方便选择嘛。。。
第二步:按照贪心原则 选中一个活动,然后排除 所有与该活动 有冲突的活动。
第三步:继续选择下一个活动。其实,第二步与第三步合起来就是:每次都选结束时间最早的活动,但是后面选择的活动不能与前面选择的活动有冲突。
*/
/*结束时间未排序,新建一个类进行排序,再进行贪心算法选择*/
/*新建一个类,方便将活动时间排序*/
public class Huodong_paixu_class implements Comparable<Huodong_paixu_class>
{
private int startTime;
private int endTime;
public Huodong_paixu_class(int startTime, int endTime){
super();
this.startTime = startTime;
this.endTime = endTime;
}
public int getStartTime()
{
return startTime;
}
public int getEndTime()
{
return endTime;
}
public void setStartTime(int startTime)
{
this.startTime = startTime;
}
public void setEndTime(int endTime)
{
this.endTime = endTime;
}
@Override
public int compareTo(Huodong_paixu_class o)
{
return this.endTime - o.endTime ;
}
}
/*贪心算法选择*/
public static int greedyActivitySelection_weipaixu(ArrayList<Huodong_paixu_class> arr,boolean[] acitivities){
acitivities[0] = true;//安排第一个活动,标记为true
int count = 1;
int j = 0;
for(int i = 1;i<acitivities.length;i++) {
//当前最早结束的活动开始时间晚于前一个活动的结束时间
if(arr.get(i).getStartTime() >= arr.get(j).getEndTime()) {
acitivities[i] = true;//表示两个活动兼容,将活动标记为true
j = i;
count++;
}
else {
acitivities[i] = false;//与已安排活动不兼容,标记未安排
}
}
return count;
}
public static void main(String[] args) {
/*已排序*/
int[] s = {1,3,0,5,3,5,6,8,8,2,12};//start time
int[] f = {4,5,6,7,8,9,10,11,12,13,14};//finish time
int n = s.length;//活动的个数
boolean[] a = new boolean[n];
ArrayList<Huodong_paixu_class> arr = new ArrayList<Huodong_paixu_class>();
for(int i = 0; i<s.length; i++){
Huodong_paixu_class activity = new Huodong_paixu_class(s[i],f[i]);
arr.add(activity);
}
Collections.sort(arr);//集合框架的排序
int result = greedyActivitySelection_weipaixu(arr,a);
System.out.println(result);
}
}
活动安排--贪心算法(活动未排序)
猜你喜欢
转载自blog.csdn.net/languolan/article/details/81836592
今日推荐
周排行