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