7.区域贪心算法难点剖析

7.区域贪心算法难点剖析

1. 区间无交集问题

通过之前的文章,可以对贪心有一个大致的了解。下面来看一个稍微复杂一点的问题,即区间不相交问题:给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两没有交集。例如对开区间(1,3)、(2,4)、(3,5)、(6,7)来说,可以选出最多三个区间(1,3)、(3,5)、(6,7),它们互相没有交集。

在这里插入图片描述

源代码:

#include <bits/stdc++.h>
using namespace std;
struct qujian{
	int x,y; // x左端点 y右端点 
};
bool paixu(qujian a,qujian b)
{
	if(a.x!=b.x) return a.x>b.x;   //左端点不同按照降序排列 
	else return a.y>b.x;   //左端点相同按照右端点升序排列 
}
int main()
{
	int n;
	qujian a[100];
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
	sort(a,a+n,paixu);
	int cn=1,lastx=a[0].x;  // cn为不相交区间的个数 [自身算一个从1开始计数]   lastx为上一个区间的左端点位置
	for(int i=1;i<n;i++) 
	{
		if(a[i].y<=lastx)  //注意:小于等于 
		{
			cn++;
			lastx=a[i].x;
		}
	}
	cout<<cn<<endl;
	return 0;
}


2.区域选点问题

给出N个闭区间[x,y],求最少需要确定多少个点,才能使每个闭区间中都至少存在一个点。例如对闭区间[1,4]、[2,6]、[5,7]来说,需要两个点(例如3、5)才能保证每个闭区间内都有至少有一个点。
区间选点问题的代码只需要把区间不相交问题代码中的“I[i]y<=lastX”改为“Ii]y<lastX”
贪心是用来解决一类最优化问题,并希望由局部最优策略来推得全局最优结果的算法思想。

发布了14 篇原创文章 · 获赞 14 · 访问量 559

猜你喜欢

转载自blog.csdn.net/xg987599519/article/details/103974141