区间分组问题

区间分组

题目描述

给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
请输出最小组数。
输入格式
第一行包含整数 N,表示区间数。
接下来 N行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示最小组数。
数据范围
1≤N≤105, −109≤ai≤bi≤109
输入样例:
3
-1 1
2 4
3 5
输出样例:
2

问题分析

考虑使用 贪心算法数学证明略
步骤:1. 将所有区间按照左端点从小到大排序;
2. 从前向后处理每个区间,判断能否将其放到某个现有的组中;
3. 如果不存在这样的组,则建一个新组,然后将其放进去;
4. 如果存在这样的组,将其放进去,并更新当前组的最大右端点值。
数据结构: 优先队列

代码实现
#include <iostream>
#include <algorithm>
#include <queue>
 
using namespace std;
const int N = 100007;

int n;
struct qujian
{
	int l, r;
	bool operator< (const qujian& o) const
	{
		return l < o.l;//左端点 
	}
}qj[N];

int main()
{
	scanf("%d", &n);
	for(int i = 0; i < n; i ++)
	{
		int l, r;
		scanf("%d%d",&l, &r);
		qj[i] = {l, r};
	}
	sort(qj,qj + n);
	
	priority_queue<int, vector<int>, greater<int> > heap;
	for(int i = 0; i < n; i ++)
	{
		qujian r = qj[i];
		if(heap.empty() || heap.top() >= r.l) heap.push(r.r);
		else
		{
			int t = heap.top();
			heap.pop();
			heap.push(r.r);
		}
	}
	
	printf("%d\n",heap.size());

  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值