贪心之区间选点
题目链接:905. 区间选点 - AcWing题库
题目描述:给你一些区间,要求选点,使得每个区间内至少有一个点,求选择的点数量最少为多少
算法步骤
1)将每个区间按右端点从小到大排序
2)从前往后枚举每个区间
若当前区间已经包含点,则直接pass
否则,选择当前区间右端点
算法证明
ans:答案,即区间选点的最小数量,最优解
cnt:通过贪心选择点的数量,贪心算法求出的点
ans <= cnt // cnt是其中一种方案,而ans是最小数量的一种方案,故ans <= cnt
ans >= cnt //假设,区间从小到大排序为cnt个区间,两两之间不相交。所以覆盖每一个区间至少需要cnt个点。
注意事项
结构体排序问题,定制sort函数对结构体进行排序
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n;
//结构体存放区间
struct Range{
int l,r;
}range[N];
//定制sort函数对结构体进行排序
bool cmp(Range a,Range b)
{
return a.r < b.r;//将每个区间按右端点从小到大排序
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
{
int a,b;
cin >> a >> b;
range[i].l = a;
range[i].r = b;
}
//1.将每个区间按右端点从小到大排序
sort(range,range + n,cmp);
//res是答案,即选择点的最小数量,ed为每次选的点
int res = 0,ed = -2e9;
for(int i = 0; i < n; i ++ )
{
//新区间不包含所选点
if(range[i].l > ed)
{
res ++;//答案加一
ed = range[i].r;//将区间右端点变成新的点
}
}
cout << res << endl;
return 0;
}