活动安排--贪心算法(活动未排序)

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