C++区间覆盖(贪心算法)

假设有n个区间,分别是:[l1,r1], [l2,r2], [l3,r3].....[ln,rn]

从这n个区间中选出某些区间,要求这些区间满足两两不相交,最多能选出多少个区间呢?

基本思路:

按照右端点从小到大排序,再比较左端点与前面覆盖的区域。每次选择左端点与前面的已经覆盖的区间不重合而右端点又尽量小的区间,这样可以让剩下的未覆盖的区间尽可能的大,就可以放置更多的区间。

实现:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1001;
struct range{
	int left;
	int right;
}a[maxn];

bool comp(range a, range b){
	if(a.right != b.right){
		return a.right < b.right;
	}
	return a.left < b.left;
}
int main(){
	
	int n;
	cout << "n=";
	cin >> n;
	for(int i=0;i<n;i++){
		cout << "输入第" << i+1 << "个数\n";
		cout << "x = ";
		cin >> a[i].left;
		cout << "y = ";
		cin >> a[i].right;		
	}

	int count=1;
	sort(a,a+n,comp);
	int start = a[0].right;
	cout <<"("<<a[0].left<<","<<a[0].right<<")"<<endl;
	for(int i=1;i<n;i++){
		if(a[i].left>=start){
			count++;
			start = a[i].right;
			cout <<"("<<a[i].left<<","<<a[i].right<<")"<<endl;
		}
	}
	cout << count << endl;
	
}
相关推荐
BestOrNothing_20154 小时前
C++零基础到工程实战(4.3.3):vector数组访问与遍历
c++·迭代器·stl·vector·动态数组
charlie1145141914 小时前
通用GUI编程技术——图形渲染实战(三十三)——Direct2D与Win32/GDI互操作:渐进迁移实战
c++·图形渲染·gui·win32
文祐4 小时前
C++类之虚函数表及其内存布局(一个子类继承一个父类)
开发语言·c++
白羊by4 小时前
YOLOv1~v11 全版本核心演进总览
深度学习·算法·yolo
墨尘笔尖6 小时前
最大最小值降采样算法的优化
c++·算法
YIN_尹8 小时前
【Linux系统编程】进程地址空间
linux·c++
EverestVIP8 小时前
C++中空类通常大小为1的原理
c++
white-persist8 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
网域小星球8 小时前
C++ 从 0 入门(六)|C++ 面试必知:运算符重载、异常处理、动态内存进阶(终极补充)
开发语言·c++·面试
晚会者荣8 小时前
红黑树的插入(有图)
c++