《算法笔记》4.4——区间贪心

本文介绍了一种基于贪心策略的区间调度算法,用于解决在N个开区间中选取尽可能多且互不相交区间的优化问题。通过优先选择较短区间及在区间相交时舍弃的原则,实现有效区间选择。文章提供了算法的具体步骤和C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两之间没有交集

例如:(1,3)、(2,4)、(3,5)、(6,7) 最多选3个:(1,3),(3,5)、(6,7)

贪心算法思想:

1、基础两点:

a.优先选择短的区间
b.如果存在一个区间包含另一个区间,应选择更小的区间. 

2、算法(左端点为例)

1、对区间左端点进行从大到小排序,左端点相同按右端点从小到大排序 
2、依次选出左端点最大的区间,当待选择区间与已选区间集合相交时,舍弃待选区间(相当于将区间排序后从后向前选择区间)
3、首先:排好后的第一个不是原始序列的第一个。其次:每次直接从排好后的第一个开始选,也是为了使左边预留区间最大

//#include<bits/stdc++.h>
#include<stdio.h>
#include<algorithm>
using namespace std;

struct inteval{
	int x,y;
}in[100];

bool cmp(inteval a,inteval b){
	if(a.x!=b.x) return a.x>b.x;//左区间端点从大到小 
	else return a.y<b.y; //右区间断点从小到大
} 
int main()
{
	int n;//n个区间 
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&in[i].x,&in[i].y);
	}
	sort(in,in+n,cmp);
	int ans=1,lastx=in[0].x;//ans记录不相交区间个数,lastx为上一个被选中区间的左端点
	for(int i=1;i<n;i++){//从1开始 
		if(in[i].y<=lastx){
			ans++;
			lastx=in[i].x;
		} 
	} 
	printf("%d",ans);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值