算法复习周------“贪心问题之‘活动安排’”

后天就有一个概念考试,可是我还没复习完全。。感觉已经要Bowmmmmm了,,,

写完这个算法就去复习,不过算法考试也要临近了把

 

算法介绍:设有n个活动的集合E={1,2,.....,n},其中每个活动都要求使用同一个资源(如教室),然后给你每个活动的开始时间和结束时间,问你如何合理安排这几个活动才能使得这个教室的使用率最大化?

 

要解决这个问题我们就要使用到贪心算法了。

 

 

算法详解在这里我们还是用容易理解的例子来给大家讲解。

这里我们给出一道例题。

 

我们应该如何才能利用贪心算法安排呢?

这里的贪心策略是:每次从剩下未安排的活动中选择最早结束时间且不会与已安排的活动重叠活动来安排。

也就是说我们要按照结束时间来将这十一个活动从小到大排序

 

之后当我们排序结束后我们得到:

 

之后就开始找呗--->

①因为第一个数结束最早,所以我们一定要选择第一个数。

②找从第一个开始向后遍历寻找Si>F1的第一次出现的活动(这里是活动4)

③之后就是相同的过程

最后得到最优解。

 

 

怎么样是不是很简单??既然简单那我们就肯定不会只考笔试啊hhh,这里会考上机题目的,所以我们要将代码写出来。

 

struct act{
int begin;
int end;
};

act active[100];
bool Boo[100]={false};
bool cmp(act a,act b){
    return a.end<b.end;
    if(a.end==b.end) return a.begin<b.begin;
}
int Process(act a[],int n){
    Boo[0]=true;
    int j=0;
    for(int i=1;i<n;i++){
        if(a[i].begin>a[j].end) {
        Boo[i]=true;
        j=i;
        }
    }
    return 0;
}

这里我放上关键代码,这里我定义了结构体来存储两个数,然后运用algorithm库中的sort排序按照结束时间排序。 在Process函数中我用一个循环直接寻找(这里用变量j来存储了上一个活动的位置)

之后把符合要求的活动对应的bool数组赋值为true。

最后打印出来得到:::

 

 不过老师说了一句要用集合的形式表现出来,所以如果涉及结果的写法大家记得写成{}的形式哈。

这个算法就算结束了,大家多多练习, 其实并不难。。。加油加油

 

————————————————————————————————————————Made By Pinging

 

posted @ 2017-11-29 20:19  Ping_ing  阅读(485)  评论(0编辑  收藏  举报