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;
	
}
相关推荐
88号技师5 分钟前
2026年2月一区SCI-交叉传播优化算法Propagation Alongside Crossover-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
悠仁さん5 分钟前
数据结构 图(代码实现篇 C语言版)
数据结构·算法·图论
chase_my_dream6 分钟前
LeGO-LOAM 详细源码流程解读
c++·计算机视觉·自动驾驶
aini_lovee7 分钟前
多智能体粒子群优化(Multi-Agent Particle Swarm Optimization, MAPSO)
算法
周末也要写八哥11 分钟前
贪心法求经典算法题——最低加油次数
算法
插件开发31 分钟前
vs2015 cuda c++ 线程号的计算详解
开发语言·c++·算法
有点。31 分钟前
C++(前缀和与差分)
c++·算法
c++之路36 分钟前
Bazel C++ 构建系列文档(五):多目标与多包项目
java·开发语言·c++
Hello:CodeWorld41 分钟前
【C++ 避坑指南】告别缓冲区溢出!全面解析 std::snprintf 的安全美学与核心陷阱
开发语言·c++·安全
凡人叶枫42 分钟前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows