AcWing908 最大不相交区间数量(区间贪心)

题目:AcWing908 最大不相交区间数量

题解目录


前言

贪心问题,为了找到解决方法,我们可以尝试一些可能的贪心方法。而对于区间的贪心,不外乎就是根据区间的起始端点或者是结束端点进行排序后探索做法。
这道题目对应的实际场景可能是大学选课时,每节课都有起始时间和终止时间,求在互不冲突的情况下,学生能够选定的课程的最大数量。

一、题目陈述

AcWing908 最大不相交区间数量(区间贪心)

二、解决思路

这道题和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 区间选点进行求解。

上一篇:CF700E Cool Slogans


下一篇:用Python实现武侠小说中的武打动作残影特效