news 2026/5/23 16:05:30

任务最优调度

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
任务最优调度

一、题目描述

给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。

请计算执行完所有任务所需的最短时间。

任务执行规则如下:

  1. 任务可以按任意顺序执行,且每个任务执行耗时间均为1个时间单位。
  2. 两个同类型的任务之间必须有长度为N个单位的冷却时间,比如N为2时,在时间K执行了类型3的任务,那么K+1和K+2两个时间不能执行类型3任务。
  3. 系统在任何一个单位时间内都可以执行一个任务,或者等待状态。

说明:数组最大长度为1000,数组最大值1000。

二、输入输出描述

输入描述
  • 第一行:用半角逗号分隔的数组(任务列表),数组长度 ≤ 1000,数组元素值 ≤ 1000;
  • 第二行:任务冷却时间N(正整数,N ≤ 100)。
输出描述
  • 一个整数,表示执行完所有任务所需的最短时间

三、示例

输入

2,2,2,3
2

输出7
说明时间1:执行类型2任务。
时间2:执行类型3的任务(因为冷却时间为2,所以时间2不能执行类型2的任务)。
时间3:系统等待(仍然在类型2的冷却时间)。
时间4:执行类型2任务。
时间5:系统等待。
时间6:系统等待。
时间7:执行类型2任务。
因此总共耗时7。

四、解题思路

1. 核心思想

基于任务调度的冷却约束特性,优先计算 “受冷却限制的理论最短时间”,再与 “任务总数量” 取最大值,确保既满足冷却规则,又完成所有任务。核心是 “以出现次数最多的任务为核心构建时间框架,填充其他任务或闲置,最终取约束与总量的最大值”。

2. 问题本质分析
  • 表层问题:计算满足冷却约束的任务执行最短时间;
  • 深层问题:
  1. 约束核心:出现次数最多的任务是冷却约束的 “瓶颈”—— 这类任务的执行间隔直接决定了理论最短时间;
  2. 时间框架:以最多次数任务k为基础,构建k-1个 “冷却周期”(每个周期n+1个时间单位),最后补充剩余的p个最大次数任务;
  3. 边界情况:若任务种类足够多(或冷却时间为 0),冷却约束无影响,最短时间等于任务总数量;
  4. 效率优化:无需模拟任务执行过程,通过数学公式直接计算,时间复杂度仅为 O (m)(m 为任务数量)。
3. 核心逻辑
  • 统计基础数据:计算每个任务的出现次数,找到最大次数k和对应任务数p
  • 计算理论最短时间:(k-1)×(n+1)+p(核心任务的冷却框架时间);
  • 取最大值:理论时间与任务总数的最大值即为最终结果(保证两种场景都覆盖)。
4. 步骤拆解
  1. 统计任务出现次数

    • 遍历任务列表,用HashMap记录每个任务的出现次数,得到 “任务类型 - 次数” 的映射。
  2. 提取关键参数

    • 找到所有任务次数中的最大值k(出现次数最多的任务的次数);
    • 统计有多少个任务的次数等于k,记为p
  3. 计算两种候选时间

    • 候选 1(冷却约束时间):(k-1)×(n+1)+p
    • 候选 2(任务总量时间):tasks.length
  4. 确定最终结果

    • 取两个候选时间的最大值,即为满足冷却约束的最短执行时间。

五、代码实现

import java.util.Arrays; import java.util.HashMap; import java.util.Scanner; public class Main { // 输入获取 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] tasks = Arrays.stream(sc.next().split(",")).mapToInt(Integer::parseInt).toArray(); int n = sc.nextInt(); System.out.println(getResult(tasks, n)); } // 算法入口 public static int getResult(int[] tasks, int n) { HashMap<Integer, Integer> cnts = new HashMap<>(); for (int task : tasks) { cnts.put(task, cnts.getOrDefault(task, 0) + 1); } // k表示:最多任务的数量 // 比如2,2,2,3, 其中任务2数量最多,有3个,则k = 3 int k = cnts.values().stream().max((a, b) -> a - b).orElse(0); // p表示:数量为k的任务个数 // 比如2,2,2,3,3,3,4, 其中数量为3的任务有2个,分别是任务2,任务3,则p=2 int p = 0; for (Integer task : cnts.keySet()) { if (cnts.get(task) == k) p++; } return Math.max((k - 1) * (n + 1) + p, tasks.length); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 6:36:59

Python---pandas

一、Pandas 显示设置 (Option) 这些命令决定了你在屏幕上看到数据的样子&#xff0c;通常放在脚本的最开头。命令解读代码示例显示所有列别让中间的列变成省略号 ...pd.set_option(display.max_columns, None)显示所有行慎用&#xff01;数据量大时会刷屏pd.set_option(display…

作者头像 李华
网站建设 2026/5/1 2:35:38

【信号处理】HST水平同步压缩变换附Matlab复现含文献

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/5/16 4:57:44

Python 精确计算:告别浮点数陷阱,decimal 模块实战指南

目录Python 精确计算&#xff1a;告别浮点数陷阱&#xff0c;decimal 模块实战指南第一章&#xff1a;浮点数的“原罪”&#xff1a;为什么你的计算结果总是怪怪的&#xff1f;1.1 罪魁祸首&#xff1a;IEEE 754 标准1.2 什么时候我们需要绝对精确&#xff1f;第二章&#xff1…

作者头像 李华
网站建设 2026/5/17 3:58:12

SMBus状态码说明:入门级错误处理指南

让总线“说话”&#xff1a;SMBus状态码实战解析与嵌入式调试心法你有没有遇到过这样的场景&#xff1f;系统上电后&#xff0c;温度传感器读数始终为0&#xff0c;电池信息无法获取&#xff0c;内存SPD数据抓不到……你以为是软件逻辑出了问题&#xff0c;翻遍代码却找不到bug…

作者头像 李华
网站建设 2026/5/3 13:09:09

从零搭建鲲鹏 HPC 环境:从朴素矩阵乘法到高性能实现

一、引言 高性能计算&#xff08;HPC&#xff09;是科学研究和工程应用的重要支撑&#xff0c;而矩阵运算是 HPC 领域最基础也最重要的操作之一。本文将通过一个简单但实用的案例&#xff0c;矩阵乘法的并行优化&#xff0c;从零开始在鲲鹏平台上进行 HPC 开发实践。 二、环境准…

作者头像 李华
网站建设 2026/5/19 4:10:03

独立IP服务器有哪些常见的应用场景?

独立IP服务器凭借其专属IP地址、高安全性和稳定性&#xff0c;在多个关键业务场景中发挥着重要作用。以下是独立IP服务器的主要应用场景&#xff1a;一、大型企业网站与电商平台独立IP服务器是大型企业官网和电商平台的首选方案。对于日均访问量百万级的企业网站&#xff0c;独…

作者头像 李华