1介绍
本节记录了贪心算法的三类区间问题:互不相交,区间覆盖,区间选点。按照自己的思路进行了一定的解析。较为简单,不说废话了。
2互不相交_会议室问题
2.1解析
问题:有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。
该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。
(1) 依据贪心思想,每次选取最优结果,倘若每次从未举办的活动中选取活动结束时间最早的活动来举办,是否意味着在24内就能尽可能多的举办活动呢?
(2) 将数组按结束时间排序,在选择时还要确保下次开始时间大于等于本次结束时间
2.2源码
#include<iostream>
using namespace std;
#define Max 10//最多活动个数
int main(){
int i,j,temp;//循环用
int n;//活动个数
int arry[Max][2];
int sum;//活动个数
int s=0,e=24;//一天24个小时【0,24】
cin>>n;
for(i=0;i<n;i++){
cin>>arry[i][0]>>arry[i][1];
}
//冒泡排序:升序
//按结束时间排序
for (i = 0; i < n; i++){
for (j = i + 1; j < n; j++){
if (arry[i][1]> arry[j][1]){
temp=arry[i][1];
arry[i][1]=arry[j][1];
arry[j][1]=temp;
//整组交换
temp=arry[i][0];
arry[i][0]=arry[j][0];
arry[j][0]=temp;
}
}
}
//初始化赋值
temp=arry[0][1];
cout<<"["<<arry[0][0]<<","<<arry[0][1]<<")"<<endl;
sum=1;
for(i=1;i<n;i++){
if(temp<=arry[i][0]){
sum++;
temp=arry[i][1];
cout<<"["<<arry[i][0]<<","<<arry[i][1]<<")"<<endl;
}
//应该判断一下合法性,但是怕影响思路,还是不要了
//if(arry[i][1]>24 || arry[i][0]>24)
//break;
}
cout<<sum;
return 0;

本文解析了贪心算法中的三类区间问题:互不相交的会议室问题、区间覆盖问题及区间选点的海岸线问题,并提供了源码实现。
最低0.47元/天 解锁文章
1051

被折叠的 条评论
为什么被折叠?



