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

版权声明:关中大侠Lv轻侯 https://blog.csdn.net/weixin_44312186/article/details/88538015

题目:给出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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44312186/article/details/88538015
今日推荐