【华为OD-E卷 - 任务最优调度 100分(python、java、c++、js、c)】

devtools/2025/2/5 7:06:26/

pythonjavacjsc_0">【华为OD-E卷 - 任务最优调度 100分(pythonjava、c++、js、c)】

题目

给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。
请计算执行完所有任务所需的最短时间。
任务执行规则如下:
任务可以按任意顺序执行,且每个任务执行耗时间均为1个时间单位 两个同类型的任务之间必须有长度为N个单位的冷却时间,比如N为2时,在时间K执行了类型3的任务,那么K+1和K+2两个时间不能执行类型3任务 系统在任何一个单位时间内都可以执行一个任务,或者等待状态。 说明:数组最大长度为1000,数组最大值1000

输入描述

  • 第一行记录一个用半角逗号分隔的数组,数组长度不超过1000,数组元素的值不超过1000, 第二行记录任务冷却时间,N为正整数,N<=100

输出描述

  • 输出为执行完所有任务所需的最短时间

用例

用例一:
输入:
2,2,2,3
2
输出:
7

python_36">python解法

  • 解题思路:
  • 任务计数:

使用 Counter 来统计每个任务出现的频率,这样我们能快速了解哪些任务最多,并计算出这些任务的数量。
找到最频繁的任务:

最频繁的任务会影响到整体执行时间,因为它们需要“隔开”执行,每个相同的任务之间需要加上冷却时间。因此,我们需要计算出任务出现的最大频次以及最大频次的任务数量。
任务调度的最小时间计算:

假设最频繁的任务需要间隔 cool_down 时间来执行。如果最频繁的任务的出现次数为 max_freq,那么这类任务之间的间隔时间为 (max_freq - 1) * (cool_down + 1),其中 (max_freq - 1) 是其他任务间隔的数量,cool_down + 1 是任务间隔时间(冷却时间加上任务本身的执行时间)。
由于可能有多个任务频率与 max_freq 相同,因此我们需要考虑最频繁的任务的数量 count_max_freq,它们会填充这些间隔位置。
最终结果:

最终的时间应该是 max((max_freq - 1) * (cool_down + 1) + count_max_freq, len(tasks))。即,如果冷却时间安排后的时间小于任务数量,那么就返回任务数量,因为每个任务至少需要执行一次

python">from collections import Counterdef min_exec_time(tasks, cool_down):# 统计每个任务的出现频率freq_map = Counter(tasks)# 获取任务中出现频率最高的任务次数max_freq = max(freq_map.values())# 计算出现最大频率的任务数量(可能有多个任务频率相同)count_max_freq = sum(1 for freq in freq_map.values() if freq == max_freq)# 计算调度这些任务所需的最短时间:# (max_freq - 1) * (cool_down + 1) 是间隔时间# count_max_freq 是填充这些间隔的额外任务数return max((max_freq - 1) * (cool_down + 1) + count_max_freq, len(tasks))# 输入获取
input_tasks = input().split(",")  # 输入任务列表,用逗号分隔
tasks = list(map(int, input_tasks))  # 将输入转换为整数列表
cool_down = int(input())  # 输入冷却时间# 调用函数并输出结果
print(min_exec_time(tasks, cool_down))

java_81">java解法

  • 解题思路
  • 任务频率统计:

使用一个 HashMap 来统计每个任务出现的频次。这样可以方便地找出任务中出现次数最多的任务,以及有多少个任务的频次相同。
计算最大频次和频次对应任务的数量:

找到出现频次最高的任务数,并计算有多少种任务的出现频率等于最大频率。
计算最小执行时间:

根据最大频次和冷却时间计算最小时间:
任务调度中,最频繁的任务会限制整体的执行时间。我们需要给它们之间加上冷却时间。
如果最频繁任务的出现次数是 maxFreq,那么这些任务之间至少需要 (maxFreq - 1) * (coolDown + 1) 的时间。
由于可能有多个任务频率与 maxFreq 相同,我们需要考虑这些任务如何填充任务空隙。
最终结果是:max((maxFreq - 1) * (coolDown + 1) + countMaxFreq, tasks.length)。这样可以保证即使冷却时间调整后,至少能保证每个任务的执行

java">import java.util.HashMap;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建Scanner对象读取输入Scanner sc = new Scanner(System.in);// 读取任务列表并拆分成字符串数组String[] inputTasks = sc.next().split(",");int[] tasks = new int[inputTasks.length];// 将任务列表字符串数组转为整数数组for (int i = 0; i < inputTasks.length; i++) {tasks[i] = Integer.parseInt(inputTasks[i]);}// 读取冷却时间int coolDown = sc.nextInt();// 调用 minExecTime 函数计算最小执行时间并输出System.out.println(minExecTime(tasks, coolDown));}// 计算最小执行时间public static int minExecTime(int[] tasks, int coolDown) {// 创建一个 HashMap 用于统计每个任务的出现频次HashMap<Integer, Integer> freqMap = new HashMap<>();// 遍历任务数组并统计每个任务的频率for (int task : tasks) {freqMap.put(task, freqMap.getOrDefault(task, 0) + 1);}// 获取任务中出现次数最多的频率int maxFreq = freqMap.values().stream().max(Integer::compareTo).orElse(0);// 统计最大频率的任务个数int countMaxFreq = 0;for (int freq : freqMap.values()) {if (freq == maxFreq) countMaxFreq++;}// 计算最短执行时间:// (maxFreq - 1) * (coolDown + 1) 是最频繁任务的最短间隔时间// countMaxFreq 是填充这些间隔的额外任务数// 返回值是 (间隔时间 + 任务数量) 的最大值,确保任务数量足够return Math.max((maxFreq - 1) * (coolDown + 1) + countMaxFreq, tasks.length);}
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

javascript">更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


http://www.ppmy.cn/devtools/156201.html

相关文章

【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解

一、SIB33信令概述 在5G非地面网络&#xff08;NTN&#xff09;中&#xff0c;卫星的高速移动性和广域覆盖特性使得地面设备&#xff08;UE&#xff09;需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息&#xff0c;SystemInformationBlockType33&#x…

【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法

45. 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 num…

接口测试用例设计-笔记

接口测试的测试点 接口测试维度-功能测试 单接口功能测试&#xff1a;一个单独的业务&#xff0c;就对一个独立的接口。如登录业务&#xff0c;对应登录接口 业务场景功能测试&#xff1a;多个接口被连续调用。&#xff08;模拟用户的实际使用场景&#xff09; 接口测试维度-…

pytorch实现半监督学习

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;结合了有监督学习和无监督学习的特点&#xff0c;通常用于部分数据有标签、部分数据无标签的场景。其主要步骤如下&#xff1a; 1. 数…

QT知识点复习

1.qt核心机制 对象树、信号和槽、事件机制 2.对象树的作用 优化了内存回收机制。子对象实例化的时候&#xff0c;被父对象放对象树上&#xff0c;父对象释放内存&#xff0c;子对象也释放内存 3.信号和槽的作用 实现多个组件之间的通讯 4.信号和槽的几种连接方式 1.UI界面提…

STM32F103ZET6完整技术点(持续更新~)

①STM32②F③103④Z⑤E⑥T⑦6简介&#xff1a; ①基于ARM核心的32位微控制器&#xff0c;②通用类型&#xff0c;③增强型&#xff0c;④引脚数目144个 ⑤闪存存储器容量&#xff1a;512K字节&#xff0c;⑥封装:LQFP&#xff0c;⑦温度范围&#xff1a;工业级温度范围&#xf…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…

蓝桥杯之c++入门(四)【循环】

目录 前言6. while循环6.1 while语法形式6.2 执行流程6.3 实践6.4 练习练习1&#xff1a;反向输出每一位练习2&#xff1a;数位之和练习3&#xff1a;求和1练习4&#xff1a;含 k 个 3 的数练习5&#xff1a;角谷猜想练习6&#xff1a;计算多项式的值 7. for循环7.1 for循环语法…