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

【蓝桥杯】贪心算法

1. 区间调度

1.1. 题目

给定n个区间,每个区间由开始时间start和结束时间end表示。请选择最多的互不重叠的区间,返回可以选择的区间的最大数量。

输入格式

  • 第一行包含一个整数n,表示区间的数量

  • 接下来n行,每行包含两个整数,分别表示区间的开始时间和结束时间

输出格式

  • 一个整数,表示最多可以选择的互不重叠的区间数量

示例输入

4
1 3
2 4
3 5
6 7

示例输出

3

1.2. 思路

1. 理解问题:我们需要从给定的多个区间中选出尽可能多的区间,且这些区间之间没有任何重叠部分。

2. 贪心算法思想:贪心算法在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优的结果。对于区间调度问题,常见的贪心策略有:

  • 最早开始时间

  • 最早结束时间

  • 最短区间长度

  • 最少冲突区间

其中,"最早结束时间"策略被证明可以得到最优解。

3. 为什么选择最早结束时间?

  • 选择一个结束早的区间,可以给后面留下更多的时间安排其他区间

  • 这样能最大化剩余可用时间,从而可能选择更多区间

4. 算法步骤

  1. 将所有区间按照结束时间从小到大排序

  2. 初始化选择的区间数量为0,记录上一个选中区间的结束时间

  3. 遍历排序后的区间:

    • 如果当前区间的开始时间 >= 上一个选中区间的结束时间

    • 则选择当前区间,更新结束时间,计数+1

  4. 返回最终的计数结果

5. 时间复杂度

  • 排序:O(n log n)

  • 遍历:O(n)

  • 总时间复杂度:O(n log n)

1.3. 代码

# 读取输入
n = int(input())  # 区间数量
intervals = []
for _ in range(n):
    start, end = map(int, input().split())
    intervals.append([start, end])

"""
计算最多可以选择的互不重叠的区间数量  
参数:intervals: 区间列表,每个区间表示为[start, end]  
返回:最多可以选择的互不重叠的区间数量
"""
# 特殊情况处理:如果没有区间或只有一个区间
if not intervals:
    print(0)
if len(intervals) == 1:
    print(1)
# 1. 按照区间的结束时间进行升序排序
# 这样我们可以优先选择结束早的区间

相关文章:

  • Firebase Studio,谷歌推出的云端AI 开发环境
  • SpringBoot师生共评作业管理系统设计与实现
  • 从零开始学Python游戏编程20-游戏循环模式2
  • spark Core-RDD转换算子
  • 【day1】AI软件测试学习笔记
  • Java bs架构/反射
  • 数据结构与算法之3.1 符号表
  • DeepSeek开源周开源的五个项目分析
  • openharmony—release—4.1开源鸿蒙源码编译踩坑记录
  • springboot中如何处理跨域
  • ZYNQ笔记(一):hello world
  • 如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板
  • UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题
  • SQL入门篇,数据库基础语法与核心操作
  • YOLOv8主干网络升级——融合ResNet18/34/50/101的高效特征提取架构设计
  • 天梯集训笔记整理
  • Git分布式版本控制系统从入门到精通(B站黑马)学习笔记
  • Spark-Core编程
  • Java 如何实现类的热加载和热部署?
  • jQueryHTML与插件
  • 多国语言网站模板/想做app推广项目在哪找
  • wordpress copyfeed/百中搜优化软件靠谱吗
  • 可以做ppt的网站或软件/青岛网站建设微动力
  • 游学做的好的网站/网络推广平台哪家公司最好
  • wordpress防36kr/关键词推广优化app
  • 开发者导航/百度seo通科