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

贪心算法经典应用:最优答疑调度策略详解与Python实现

目录

引言:从现实场景到算法设计

一、问题背景与数学建模

1.1 现实场景抽象

1.2 时间线分析

二、贪心策略的数学证明与选择依据

2.1 贪心选择性质

2.2 证明过程

三、算法实现与代码解析

3.1 算法步骤分解

3.2 代码亮点解析

四、测试案例与结果验证

4.1 示例分析

4.2 边界测试

五、算法复杂度分析

5.1 时间复杂度

5.2 空间复杂度

六、进阶思考与扩展

6.1 变种问题

6.2 实际应用


引言:从现实场景到算法设计

在校园生活中,我们常常会遇到这样的场景:当多名同学同时需要找老师答疑时,如何安排顺序才能让整体效率最高?这个问题看似简单,实则暗含深刻的算法思想。本文将以LeetCode风格的编程题为例,深入探讨如何通过贪心算法实现最优调度策略,并结合Python代码实现,带你一步步掌握这一经典问题的解决思路。

一、问题背景与数学建模

1.1 现实场景抽象

题目描述:
有n位同学同时找老师答疑,每位同学需要经历以下步骤:

  1. 进入办公室耗时s
  2. 答疑耗时a
  3. 发送消息(时间忽略)
  4. 离开办公室耗时e

目标:通过合理安排顺序,使得所有同学发送消息的时刻之和最小。

1.2 时间线分析

以两位同学为例,假设同学A和B的参数分别为:

  • A:s₁, a₁, e₁
  • B:s₂, a₂, e₂

若A先答疑,总消息时间计算公式为:
消息总和 = (s₁+a₁) + (s₁+a₁+e₁+s₂ +a₂)
若B先答疑,总消息时间计算公式为:
消息总和 = (s₂+a₂) + (s₂+a₂+e₂+s₁ +a₁)

通过对比两种情况的差值,可以推导出最优调度的判断条件。

二、贪心策略的数学证明与选择依据

2.1 贪心选择性质

核心结论
当且仅当同学i的总时间 (s_i + a_i + e_i) 小于同学j的总时间时,i应优先安排。

2.2 证明过程

假设存在两个同学i和j:

  • 若i排在j前面,总消息和为:
    S1 = (s_i+a_i) + (s_i+a_i+e_i + s_j + a_j)
  • 若j排在i前面,总消息和为:
    S2 = (s_j+a_j) + (s_j+a_j+e_j + s_i + a_i)

计算差值:
Δ = S1 - S2 = (e_i - e_j) + (s_i + a_i + e_i) - (s_j + a_j + e_j)

要使S1 < S2,需满足:
Δ < 0 ⇒ (s_i + a_i + e_i) < (s_j + a_j + e_j)

这表明,总时间较短的同学应优先安排,这就是贪心选择的数学依据。

三、算法实现与代码解析

3.1 算法步骤分解

  1. 输入处理:读取n名同学的参数
  2. 排序策略:按(s + a + e)升序排列
  3. 时间计算:维护当前时间戳,逐个计算消息发送时刻
  4. 结果输出:返回总和的最小值
def main():import sysn = int(sys.stdin.readline())students = []for _ in range(n):s, a, e = map(int, sys.stdin.readline().split())students.append((s, a, e))# 关键排序步骤students.sort(key=lambda x: x[0] + x[1] + x[2])total = 0current_time = 0for s, a, e in students:message_time = current_time + s + atotal += message_timecurrent_time += s + a + e  # 更新为离开时间print(total)main()

3.2 代码亮点解析

  • 排序键值x[0]+x[1]+x[2]直接对应总时间,确保排序正确性
  • 时间戳维护:通过current_time精确跟踪流程,避免重复计算
  • 空间效率:仅需O(n)存储空间,符合题目约束

四、测试案例与结果验证

4.1 示例分析

输入

3
10000 10000 10000
20000 50000 20000
30000 20000 30000

排序结果
同学1(总时间30000)→ 同学3(总时间80000)→ 同学2(总时间90000)

计算过程

  • 同学1消息时间:10000+10000=20000
  • 同学3消息时间:20000+30000+20000+30000=100000
  • 同学2消息时间:100000+30000+20000+30000+20000+50000=280000
    总和:20000+100000+160000=280000(与预期一致)

4.2 边界测试

  • 单人场景:直接返回s+a
  • e取极值时:验证排序优先级是否正确

五、算法复杂度分析

5.1 时间复杂度

  • 排序:O(n log n)(Python内置排序算法)
  • 遍历:O(n)
    总复杂度:O(n log n),满足题目n≤1000的规模要求

5.2 空间复杂度

  • 存储学生数据:O(n)
  • 其他变量:O(1)
    总空间复杂度:O(n),符合内存限制

六、进阶思考与扩展

6.1 变种问题

  • 若e的取值范围扩展:仍可沿用现有策略
  • 若需考虑老师休息时间:需引入优先队列优化

6.2 实际应用

  • 任务调度系统:类似CPU任务调度问题
  • 物流配送优化:货物装载顺序规划
  • 网络请求合并:最小化总响应时间

相关文章:

贪心算法经典应用:最优答疑调度策略详解与Python实现

目录 引言&#xff1a;从现实场景到算法设计 一、问题背景与数学建模 1.1 现实场景抽象 1.2 时间线分析 二、贪心策略的数学证明与选择依据 2.1 贪心选择性质 2.2 证明过程 三、算法实现与代码解析 3.1 算法步骤分解 3.2 代码亮点解析 四、测试案例与结果验证 4.1 …...

SpringBoot 3+ Lombok日志框架从logback改为Log4j2

r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2&#xff0c;并配置按日期滚动文件和控制台输出&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;排除Logback并添加Log4j2依赖 在pom.xml中修改依赖&#xff1a; <dependencies><!-- 排除默…...

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL错误解决&#xff1a;Invalid default value for xxx_time’问题分析与修复方案 问题描述 在MySQL数据库操作中&#xff0c;当尝试创建或修改表结构时&#xff0c;可能会遇到以下错误信息&#xff1a; [bug] [42000][1067] Invalid default value for xxx_time这个错误…...

网站安全专栏-------浅谈CC攻击和DDoS攻击的区别

CC攻击和DDoS攻击都是网络攻击的类型&#xff0c;但它们在攻击方式、目标和效果上有所不同。以下是它们之间的一些主要区别&#xff1a; ### 1. 定义 - **DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;**&#xff1a; DDoS攻击是指攻击者通过大量的分布式计算机&#x…...

【Tauri2】002——Cargo.toml和入口文件

目录 前言 正文 toml文件的基础 注释——# Comment 键值对——Key/Value 表——[table] 内联表——Inline Table 数组——Array package和crate Cargo.toml文件 Cargo.toml——dependencies Cargo.toml——lib crate-type main.rs 前言 【Tauri2】001——安装及…...

二叉树相关算法实现:判断子树与单值二叉树

目录 一、判断一棵树是否为另一棵树的子树 &#xff08;一&#xff09;核心思路 &#xff08;二&#xff09;代码实现 &#xff08;三&#xff09;注意要点 二、判断一棵树是否为单值二叉树 &#xff08;一&#xff09;核心思路 &#xff08;二&#xff09;代码实现…...

CSS 美化页面(一)

一、CSS概念 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于描述 HTML 或 XML&#xff08;如 SVG、XHTML&#xff09;文档 样式 的样式表语言。它控制网页的 外观和布局&#xff0c;包括字体、颜色、间距、背景、动画等视觉效果。 二、CS…...

23种设计模式-组合(Composite)设计模式

组合设计模式 &#x1f6a9;什么是组合设计模式&#xff1f;&#x1f6a9;组合设计模式的特点&#x1f6a9;组合设计模式的结构&#x1f6a9;组合设计模式的优缺点&#x1f6a9;组合设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是组合设计模式…...

LSTM创新点不足?LSTM + Transformer融合模型引领Nature新突破

LSTM创新点不足&#xff1f;LSTM Transformer融合模型引领Nature新突破 2024年LSTM真的没有创新空间了吗&#xff1f; 最新研究表明&#xff0c;通过将LSTM与Transformer巧妙融合&#xff0c;依然能创造出Nature级别的突破性成果。LSTM擅长处理短期时序模式&#xff0c;但在…...

【区块链安全 | 第六篇】NFT概念详解

文章目录 NFTNFT&#xff08;非同质化代币&#xff09;FT&#xff08;可替代代币&#xff09; 以太坊 NFT 标准ERC-721&#xff08;单一资产&#xff09;ERC-1155&#xff08;多资产&#xff09; NFT 市场版税机制NFT 借贷NFT 安全 NFT NFT&#xff08;Non-Fungible Token&…...

React组件简介

组件 在 React 中&#xff0c;组件&#xff08;Component&#xff09; 是 UI 的基本构建块。可以把它理解为一个独立的、可复用的 UI 单元&#xff0c;类似于函数&#xff0c;它接受输入&#xff08;props&#xff09;&#xff0c;然后返回 React 元素来描述 UI。 组件的简单…...

iOS常见网络框架

URLSession、Alamofire 和 Moya 1. URLSession 1.1 核心概念 URLSession 是 Apple 官方提供的网络请求 API&#xff0c;封装在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等协议&#xff0c;可用于&#xff1a; ​ • 普通网络请求&#xff08;GET/POST&#xff09; ​ …...

蓝桥杯备考---->激光炸弹(二维前缀和)

本题我们可以构造二维矩阵&#xff0c;然后根据题意&#xff0c;枚举所有边长为m的正方形&#xff0c;找到消灭价值最多的炸弹 #include <iostream> using namespace std; const int N 1e4; int a[N][N]; int n,m; int f[N][N]; int main() {cin >> n >> m…...

python笔记之判断月份有多少天

1、通过随机数作为目标月份 import random month random.randint(1,12)2、判断对应的年份是闰年还是平年 因为2月这个特殊月份&#xff0c;闰年有29天&#xff0c;而平年是28天&#xff0c;所以需要判断对应的年份属于闰年还是平年&#xff0c;代码如下 # 判断年份是闰年还…...

数据结构 --树和森林

树和森林 树的存储结构 树的逻辑结构 树是一种递归定义的数据结构 树是n(n≥0)个结点的有限集。当n0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 1)有且仅有一个特定的称为根的结点。 2)当n>1时&#xff0c;其余结点可分为m(m>0)个互不相交的有…...

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制&#xff0c;并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后&#xff0c;解锁资源&#xff0c;再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bi…...

Linux系统加固笔记

检查口令为空的账户 判断依据&#xff1a;存在则不符合 特殊的shell a./bin/false:将用户的shell设置为/bin/false&#xff0c;用户会无法登录&#xff0c;并且不会有任何提示信息b./sbib/nologin&#xff1a;nologin会礼貌的向用户发送一条消息&#xff0c;并且拒绝用户登录…...

【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码

本章目录 1. sync.Mutex锁的基本用法2. sync.Mutex的核心原理自旋到阻塞的升级过程自旋CAS 饥饿模式 3. sync.Mutex底层源码Mutex结构定义全局常量Mutex.Lock()方法第一次CAS加锁能够成功的前提是&#xff1f;竞态检测 Mutex.lockSlow()lockSlow的局部变量自旋空转state新值构造…...

npm前端模块化编程

1. 代码编写 使用npm和Webpack进行前端模块化编程的完整案例。这个案例将创建一个简单的网页&#xff0c;该网页显示一个标题和一个按钮&#xff0c;点击按钮会在控制台中打印一条消息。 步骤 1: 初始化项目 创建项目目录并初始化npm&#xff1a; mkdir my-modular-fronten…...

Django REST framework 源码剖析-认证器详解(Authentication)

Django REST framework 源码剖析-认证器详解(Authentication) 身份验证始终在视图的最开始运行&#xff0c;在权限和限制检查发生之前&#xff0c;以及在允许任何其他代码继续之前。request.user属性通常设置为contrib.auth包的user类的实例。request.auth属性用于任何其他身份…...

TCP/IP三次握手的过程,为什么要3次?

一&#xff1a;过程 第一次&#xff08;SYN&#xff09;&#xff1a; 客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;设置SYN1&#xff0c;并携带初始序列号Seqx&#xff08;随机值&#xff09;&#xff0c;进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…...

Centos6安装nerdctl容器运行时

Centos6安装nerdctl容器运行时 前言Centos6安装docker---失败--不可拉取镜像docker配置国内镜像加速 Centos6安装nerdctl-full容器管理工具为Centos6配置containerd服务开机自启动设置nerdctl自动补全 前言 本文写于2025年3月22日,因一些特殊业务需要用到Centos6Docker,但Cent…...

登录验证码的接口实习,uuid,code.

UID是唯一标识的字符串,下面是百度百科关于UUID的定义&#xff1a; UUID是由一组32位数的16进制数字所构成&#xff0c;是故UUID理论上的总数为16322128&#xff0c;约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID&#xff0c;要花100亿年才会将所有UUID用完。 UUID的标准…...

用fofa语法搜索漏洞

FOFA是一款非常强大的搜索引擎 关于对于fofa的描述是&#xff1a;FOFA&#xff08;网络空间资产检索系统&#xff09;是世界上数据覆盖更完整的IT设备搜索引擎&#xff0c;拥有全球联网IT设备更全的DNA信息。 探索全球互联网的资产信息&#xff0c;进行资产及漏洞影响范围分析…...

设计一个基于机器学习的光伏发电功率预测模型,以Python和Scikit - learn库为例

下面为你设计一个基于机器学习的光伏发电功率预测模型&#xff0c;以Python和Scikit - learn库为例。此模型借助历史气象数据和光伏发电功率数据来预测未来的光伏发电功率。 模型设计思路 数据收集&#xff1a;收集历史气象数据&#xff08;像温度、光照强度、湿度等&#xf…...

20242817李臻《Linux⾼级编程实践》第6周

20242817李臻《Linux⾼级编程实践》第6周 一、AI对学习内容的总结 Linux进程间通信&#xff08;IPC&#xff09; 1. 进程间通信基本概念 作用: 数据传输&#xff1a;进程间传递数据&#xff08;字节到兆字节级别&#xff09;。共享数据&#xff1a;多个进程操作同一数据&…...

Vue 3中的Provide与Inject

在Vue 3中&#xff0c;provide和inject机制为组件间的通信提供了一种新的方式。不同于传统的父子组件通过props传递数据的方式&#xff0c;provide和inject允许祖先组件向其所有子孙组件提供数据&#xff0c;而无需通过中间层手动传递。这使得跨层级的组件通信变得更加直接和简…...

深入解析SQL2API平台:数据交互革新者

在数字化转型持续深入的当下&#xff0c;企业对数据的高效利用与管理的需求愈发迫切。SQL2API平台应运而生&#xff0c;成为助力企业突破数据交互困境的有力工具&#xff0c;特别是它由麦聪软件基于DaaS&#xff08;数据即服务&#xff09;产品创新衍生而来&#xff0c;备受业界…...

蓝桥杯算法题分享(二)

蓝桥杯算法题分享 本文将继续分享三道经典的蓝桥杯算法题&#xff0c;包括题目描述、解题思路和 Java 代码实现&#xff0c;帮助大家更好地理解算法的应用。对算法感兴趣的朋友可以点开我的主页查看我上周分享的另三道题。 第一题&#xff1a;次数差 题目描述 x 星球有 26 只…...

实战-MySQL5.7升级8.0遇到的四个问题

近期几个项目的MySQL由5.7升级到8.0&#xff0c;升级过程中遇到四个问题&#xff0c;记录下来分享一下&#xff1a; 第一个问题详见之前的文章&#xff1a; MySQL 5.7升级8.0报异常&#xff1a;处理新增关键字 第二个问题详见之前的文章&#xff1a; MySQL 5.7升级8.0报异常…...