【贪心算法(二)】三类区间问题

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


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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值