[AcWing算法基础课]基础算法之贪心 区间选点

题目链接:905.区间排序

        给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。(位于区间端点上的点也算作区间内)

        这道题考查贪心算法,我先给出本题的代码。

#include<bits/stdc++.h>
using namespace std;
#define N 100010

struct range{
	int l,r;
	bool operator < (const range &x){
		return r < x.r;
	}
}Range[N];

int main(){
	int n;
	cin>>n;
	int l,r;
	for(int i=0;i<n;i++){
		cin>>Range[i].l>>Range[i].r;
	}
	sort(Range,Range+n);
	
	int cnt = 0,st = -2e9;
	for(int i=0;i<n;i++){
		if(st < Range[i].l){
			st = Range[i].r;
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

        接下来举一个例子供大家理解:

Step 1:假如有以下这6个区间,我们需要找出最少的点,使得每个区间内都至少包含一个选出的点。

Step 2:接下来,我们对这六个区间进行排序。按照右端点的大小依次排序,如下图所示。

Step 3:我们首先假设点 st 在负无穷,如果第一个区间的左端点比 st 大,那么把 st 设在该条线段的右端点,并执行 cnt++,如下图所示。对于第二个区间而言,它的左端点小于 st (又因为排过序,第二个区间的右端点必然大于 st ),所以第二个区间必然包含一个点。第三个区间同理可得。

Step 4:现在考虑第四个区间(标号为3),因为第四个区间的左端点大于 st,所以我们将第四个区间的右端点设置为 st ,并执行 cnt++。

Step 5:同理可得,将第六个区间的右端点设为 st ,cnt++。

        总结:这个题的难度较低,但是对各个区间进行排序可能是很多人想不到的。当然,这个题还有很多方法,例如以左端点的大小进行排序。希望大家学有所获!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值