当前位置: 首页 > news >正文

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

问题描述

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

S={a1,…,an}

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

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

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

分析

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

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

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

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

代码

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;}elsea[i] = 0;}cout << count;return 0;
}
  • s[i]第i个活动的开始时间
  • f[i]第i个活动的结束时间
  • a[i]第i个活动若被选中安排,则a[i]为1,若未被安排,则a[i]为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)

相关文章:

  • 三角形分类程序黑盒实验(三)(包含完整源码)
  • 深入解析C++中的队列(queue)容器:原理、应用与最佳实践
  • 16613/16614/16615系列噪声源
  • 线上创业协会小程序源码介绍
  • 52常用控件_QCheckBox的使用
  • Vue.js:现代前端开发的轻量级框架
  • 蓝桥杯 6. k倍区间
  • 来个去照片背景的GUI程序
  • git 根据http url设置账号密码
  • MySQL之text字段详细分类说明
  • 2025年C#人力外包趋势与价值分析
  • android studio 运行java main报错
  • 环状双向链表创建,删除,插入,遍历详细讲解
  • DDoS本地防御与绕线防御的区别
  • 三轴云台之开源算法篇
  • ubuntu配置网卡为AP模式
  • Spring Boot 中配置 Redis 连接池的详细
  • 台账自动统计——餐饮物资管理台账——仙盟共创平台——未来之窗
  • 软件测试之测试数据生成(Excel版)
  • 【function call】大模型的hello function call
  • 网站建设方案书 下载/东莞关键词优化推广
  • 济南网站建设培训学校/百度网盘下载安装
  • 东莞塘厦网站建设/5g站长工具查询
  • 菏泽城乡住房建设局网站/模板网站免费
  • 青岛专业公司网站设计公司/网站设计与制作
  • 做摄影和后期的兼职网站/网站快速优化排名排名