【贪心】C++ 活动安排问题

问题描述

n个需要使用某个公共资源的活动

S={a1,...,an}

ai在半开区间[si, fi)使用资源,其中si为开始时间,fi为结束时间

若区间[si, fi)与区间[sj, fj)不相交,称活动i与活动j是相容的

活动安排目标:安排最大可能相容的活动集合,即安排的活动数目最多

分析

该问题满足贪心选择性质和最优子结构性质,可以使用贪心法解决

贪心选择性质 :是指所求问题的整体最优解,可以通过一系列局部最优的选择,即贪心选择来达到

最优子结构性质:一个问题的最优解包含其子问题的最优解

将各个活动按照其结束时间排序,结束时间最早的排在前面,优先安排结束最早的活动。这样做的原因是可以为后面的其他活动留下尽可能多的时间

代码

cpp 复制代码
int main() {
	int n, count=1;
	int s[1000], f[1000], a[1000];
	a[0] = 1;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s[i] >> f[i];
	}
	sort(s, f, n);//排序
	int j = 0;
	for (int i = 1; i < n; i++) {
		if (s[i] >= f[j]) {
			count++;
			a[i] = 1;
			j = i;
		}
		else
			a[i] = 0;
	}
	cout << count;
	return 0;
}
  • s[i]第i个活动的开始时间
  • f[i]第i个活动的结束时间
  • a[i]第i个活动若被选中安排,则ai为1,若未被安排,则ai为0。可用于选出一种最优情况,但最优解不唯一
  • sort(s,f,n)按照f[i]递增的顺序对s、f数组进行排序,可选用多种排序方法,最优复杂度为O(nlogn)

运行结果

输入在给定的11个活动中,可选取第1、4、8、11项活动,此时可安排4项活动,为最多数目

最优解的情况不止一种,如,将上述情况中第8项换成第9项,同样可以安排4项,也是最优的一种情况

复杂度

算法的时间复杂度取决于排序的时间复杂度,排序的复杂度最优为O(nlogn),排序之外的复杂度只需要一次循环遍历即可,是O(n)的复杂度

故算法的时间复杂度为O(nlogn)

相关推荐
落魄大学生之流水线上谋生计7 分钟前
Java并发核心机制详解:线程池、CAS、AQS、锁升级
java·开发语言·数据库
hahaha601610 分钟前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
不会就选b16 分钟前
算法日常・每日刷题--<贪心>10
算法
南京兴帝文化传媒有限公司19 分钟前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
佳児素花痴╮30 分钟前
Qt速通2
开发语言·qt
“AI国潮设计-小江”1 小时前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
529宝宝起名网1 小时前
用 Python 分析汉字字源与起名用字的关联规律:从六书结构到文化寓意的起名偏好洞察
开发语言·python
汉克老师1 小时前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程1 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法