题解目录
前言
贪心问题,为了找到解决方法,我们可以尝试一些可能的贪心方法。而对于区间的贪心,不外乎就是根据区间的起始端点或者是结束端点进行排序后探索做法。
这道题目对应的实际场景可能是大学选课时,每节课都有起始时间和终止时间,求在互不冲突的情况下,学生能够选定的课程的最大数量。
一、题目陈述
二、解决思路
这道题和AcWing905 区间选点
的表述不同,但是代码和思考方法是一模一样的。
三、代码实现
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
// 区间个数
int n;
struct Seg{
int s,e;
}segs[N];
bool cmp(Seg a,Seg b) {
return a.e<=b.e;
}
int main() {
cin>>n;
for(int i=0;i<n;i++) cin>>segs[i].s>>segs[i].e;
sort(segs,segs+n,cmp);
int res = 0;
int temp = 1e9+10;
for(int i=0;i<n;i++) {
// 如果是temp是初始值 或者 temp小于此区间的起始点从而无法覆盖
if(temp>1e9||temp<segs[i].s) {
res ++;
temp = segs[i].e;
}
}
cout<<res<<endl;
return 0;
}
在进行结构体排序的时候,除了定义cmp函数之外,还可以在结构体中对小于运算符进行重载。语法如下:
struct Seg{
int s,e;
// 运算符重载
bool operator< (const Seg &W)const {
return e < W.e;
}
}segs[N];
sort(segs,segs+n);
总结
这道题是简单的区间贪心,可以连系AcWing905 区间选点
进行求解。