任务调度器leetcode621

2023-11-11

问题(来自LeetCode):

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。

然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的 最短时间 。

示例 1:

输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
     在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。 
示例 2:

输入:tasks = ["A","A","A","B","B","B"], n = 0
输出:6
解释:在这种情况下,任何大小为 6 的排列都可以满足要求,因为 n = 0
["A","A","A","B","B","B"]
["A","B","A","B","A","B"]
["B","B","B","A","A","A"]
...
诸如此类
示例 3:

输入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2
输出:16
解释:一种可能的解决方案是:
     A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A
 

提示:

1 <= task.length <= 104
tasks[i] 是大写英文字母
n 的取值范围为 [0, 100]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/task-scheduler
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

对于冷却时间 n,我们构造一个长为n+1,高为“任务需要执行的最多次数”的表格。n+1意义,其中1表示执行任务A需要1个时间单位,n表示执行任务后需要等待n个时间单位才能继续执行任务A。

其中任务是行优先的顺序执行

填充表格的方法:

设:任务需要需要执行的最多次数为maxExec,需要执行maxExec次的任务有maxCount个

1、优先把最长任务填充到最左边的列,那么剩下的任务的执行次数都会少于maxExec,这个时候把他们从“空位的靠左侧,倒数第二行开始,从下往上,从左到右填充到表格”。

填充完之后,我们会遇到两种情况:

1)填充后,表格还剩余“空列”,这个时候,有多少个空列,CPU就需要“待命”多少个单位时间。如下图。如果任务“按行优先,从左到右,从下往上执行”,那么,总执行时间就是前maxExec-1行的面积加上maxCount。即 (maxExec-1)*(n+1)+ maxCount

fig2

(图来自leetcode)

 2)填充后,发现表格不够填,要超出表格的列数。如下图

fig3

(图来自leetcode) 

这个时候,如果任务“按行优先,从左到右,从上往下执行”,那么同一个任务执行两次之间肯定至少间隔n个单位的时间,即肯定满足条件,那么我们只需要计算彩色部分的面积就行啦,即总任务数time = |task|

综上:当表格没超载的时候的时候,|task| <(maxExec-1)*(n+1)+ maxCount

当表格超载的时候 |task| >(maxExec-1)*(n+1)+ maxCount

所以,只需要取最大值即可。

代码实现的关键是计算出maxExec、maxCount、 |task|

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        unordered_map<char,int> freq;
        for(char &task:tasks)freq[task]+=1;
        int maxExec = max_element(freq.begin(),freq.end(),[](const auto& u,const auto& v){return u.second<v.second;})->second;
        int maxCount = accumulate(freq.begin(),freq.end(),0,[=](int acc,const auto& u){return acc+(maxExec==u.second);});
        int num_tasks = tasks.size();
        return max(num_tasks,(maxExec-1)*(n+1)+maxCount);
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

任务调度器leetcode621 的相关文章

  • 批量重命名:删除文件名相同的部分或指定的部分

    本代码提供两个函数 1 用于批量重命名文件 重命名时 删除 路径 下的文件名中含有 重复名 的部分 重命名删除同义名 路径 重复名 例如 删除 Image001 png Image002 png Image003 png 中的 Image
  • [Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前五篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 theano正规化处理 这
  • DS1302时钟模块

    DS1302结构原理图 DS1302涓流充电计时芯片实时时钟 日历和31字节的静态RAM 通过IO口与微机处理器通讯 该实时时钟 日历提供年月日和时分秒星期 还具备月份闰平年自动校正 其信息与外部的传输由CE I O和SCLk 串行时钟 决
  • 数据库聚合函数

    1 常用函数 常用函数这里就不过多的阐述和演示 大家感兴趣的话 可以去官网看 官网地址 MySQL Developer Zone 我们主要讲聚合函数 2 聚合函数 聚合函数是我们经常使用的函数 常用聚合函数名称 描述 1 count 计数
  • MySQL从安装到精通(多表)

    目录 1 创建练习环境 1 1创建一个部门表 1 2创建一个员工表 2 多表查询的分类 2 1mysql 表子查询 2 1 1什么是子查询 subquery sql 2 1 2 单行子查询 2 1 3多行子查询 2 1 2 多列子查询 2
  • 【python】如何把你的python包发布出去(pip install)

    python 如何把你的python包发布出去 pip install 介绍 实际上分为两步 打包 发布 我们要发布的网站是https pypi org 也就是用户通过pip install XXX 就可以安装你的包 1 通过setupto
  • python环境的安装(Windows)

    步骤一安装 打开python官网https www python org 点击Downloads 选择Windows进入后根据自己的电脑是32位还是64位 右击此电脑属性查看 选择相应的版本下载 注意 要选择Windows installe
  • 【2023硅谷数模笔试题】~ 题目及参考答案

    本章目录 0 前言 1 题目 答案 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 第十一题 声明 0 前言 哈喽 二舅 最近和你们一样 不断被鞭策 今天抽个小空给大家带来的是前几天做的一套笔试题 名称如标题
  • 谈谈tomcat的优化经验

    第一次写博客 搜集了很多的优化经验 然后自己归纳下来 大概有7条 没涉及到的欢迎大家补充 1 优化方法 加大tomcat使用的jvm的内存 具体操作 Tomcat默认可以使用的内存为128MB 可在配置文件或环境变量里增加使用内存 在配置文
  • IDEA创建Maven工程后卡死,问题分析及解决

    问题 同标题 IDEA创建Maven工程后卡死 网上收集经验后 大多数版本为2020及以后的问题 但应该是同样的问题 即archetype catalog xml文件太大源地址下载过慢 这里记录一下方便的解决方式 解决方法 提前将arche
  • IDEA 热部署插件 -- JRebel

    从idea找到设置Plugins插件 激活参考http www javatiku cn idea 51 html 服务器链接 http idea javatiku cn ad4bd706 15a3 4ecf b3e3 c7b6a64942b
  • GCC强大背后

    前记 经常浏览博客园的同学应该会觉得本文有标题党之嫌 这个标题的句式来自于MiloYip大牛的大作 C 强大背后 在此 向Milo兄致意 GCC 全称GNU Compiler Collection 是一套GNU开发的编译器环境 它的创始人便
  • ENVI监督分类及精度评价

    最近协助同学做了完整的监督分类数据 特此记录下来 对于ENVI监督分类 是每一个遥感从业者掌握的最基础的一个方法 但是完整的监督分类流程和精度评价 估计往往认识不够 所以以下的分享还是有点意义 监督分类 又称训练分类法 用被确认类别的样本像
  • 34岁,转行软件测试工程师后月薪8K,我仍然坚持转行!

    本人今年34岁 目前已成功转行软件测试工程师 月薪8K 对于很多人而言 我这个年纪转行不仅有些晚 还要担许多未知的职场风险 我深知自己这一路并不容易 以下就和大家分享一下我的转行经历吧 到了我这个年纪的人 大多都被社会这个大染缸染得面目全非
  • Docker搭建ELK日志采集服务及Kibana可视化图表展示

    架构 ES docker network create elk mkdir p opt ELK es data chmod 777 opt ELK es docker run d name elasticsearch net elk p 9
  • Vue——插件

    目录 介绍 编写一个插件 介绍 插件 Plugins 是一种能为 Vue 添加全局功能的工具代码 下面是如何安装一个插件的示例 import createApp from vue const app createApp app use my
  • .NET混淆器 Dotfuscator v4.43.1新版发布!允许某些外部程序集输入!

    Dotfuscator是一个 NET的Obfuscator 它提供企业级的应用程序保护 大大降低了盗版 知识产权盗窃和篡改的风险 Dotfuscator的分层混淆 加密 水印 自动失效 防调试 防篡改 报警和防御技术 为世界各地成千上万的应
  • UE4_AsyncTask应用笔记

    在开发过程中如果把所有的逻辑都放到GameThread里 难免会卡顿 因此这时候 往往会用到多线程 UE4提供的多线程解决方案有三种 这里我们着重说一下AsyncTask的应用 一般来说 用AsyncTask都是一些业务逻辑不复杂的交给它来

随机推荐

  • Sequelize的原始查询的时区问题

    在postgres数据库sequelize的raw query也是受时区影响的 同样的语句 用sequelize直接执行某些跟时间相关的query和在数据库执行是不一样的 语句如下 update table A set is enable
  • 树莓派4b基础入门

    AI嵌入式设备相关内容已合成AIOT专栏 其中包含rknn系列开发板 计算棒 jetson系列 树莓派等详细操作 实战项目源码 让小白从入门到精通 欢迎订阅 AI嵌入式设备已有专栏详细讲解 目录 一 树莓派百科知识 二 树莓派4B图解及配件
  • 0xc000007b的解决办法(续)

    最后更新 2019 3 23 请大家首先确定已经按照原文的方法及步骤尝试过 但是还是没有解决问题再来看这篇文章 如果你还没有看过原文 请先看原文 http blog csdn net VBcom article details 607070
  • ubuntu20.04交叉编译移植OpenCV4.7.0和QT5.12.12至ARM64位平台LKD3588(开发板为ubuntu20.04系统)(二)

    序 opencv部署到开发板 由于GTK问题导致opencv无法使用Gui 只能交叉编译QT 并为其作为gui供opencv使用 一 PC端交叉编译QT5 12 12 先编译tslib文件 tslib文件的下载链接 https github
  • gcc -D_REENTRANT

    在使用多线程函数时 我们经常使用编译器选项 lpthread和 D REENTRANT 前者告诉链接器链接库文件libpthread so 对于后者 gcc使用 D选项定义宏 REENTRANT的值为1 在 POSIX C SOURCE宏被
  • idea unknow facet type web 解决方案

    菜单 gt Preferences gt Plugins 添加tomcat支持 如图 然后 项目project setting中 可以添加 web类型的facets了 pasting
  • Android实现对图片的缩放、剪切、旋转、存储

    最近看到一篇关于图像处理的blog 感觉挺有用的 转载过来收藏下 一 问题描述 在开发中 当我们需要的有一张大图片同时还需要一些小图片时 我们只需要通过代码对此图片进行不同比例的缩放即可 这样大大节约资源 减小了安装包的尺寸 除缩放外 我们
  • JavaScript从题学习——你真的了解indexOf吗?

    案例 indexOf是可以传两个参数的 我们从查找字符串 abcoefoxyozzopp 中所有o出现的位置以及次数 和 red blue red green pink red 求 red 出现的位置和次数分别来看
  • 技术经理、架构师、技术总监、VP、CTO,这些岗位都是如何挣出来

    所有的职位不是别人给你的 而是你自己挣出来的 对于技术经理 首席架构师 技术总监 技术VP CTO 各个岗位之间存在差异 我将从以下五个核心点来分析 技术实力 领导力 战略观 组织能力 文化建设能力 这五个核心能力的强弱 决定你在市场的价值
  • 根据isbn查询图书信利用豆瓣的API

    String apikey 111111111111111111111111111111 String isbnUrl http api douban com book subject isbn public static void mai
  • java面向对象(一)

    面向对象 类对象方法 类的定义 作用域修饰词 一个类可以包含以下类型变量 static静态 静态变量类变量 静态方法 static代码块 final 修饰方法 修饰变量 static final 方法 构造方法特殊的方法 创建对象 访问成员
  • 什么是神经网络架构搜索?

    https mp weixin qq com s F6ZbX2JVqSOAhE2hXBnLLA
  • 洛谷 1969 积木大赛——水题

    题目 https www luogu org problemnew show P1969 include
  • 常见的几种网络故障案例分析与解决

    故障1 交换机刚加电时网络无法通信 故障现象 交换机刚刚开启的时候无法连接至其他网络 需要等待一段时间才可以 另外 需要使用一段时间之后 访问其他计算机的速度才快 如果有一段时间不使用网络 再访问的时候速度又会慢下来 故障分析 由于这台交换
  • 完全背包问题求组合数和排列数

    518 零钱兑换 II 这个是完全背包问题的典型应用 由于只是求个数 不涉及到零钱排列情况不一样算两次的情况 所以两层for循环 外层遍历物品 内层遍历背包 class Solution public int change int amou
  • 阿里云播放器prismplayer抓包的一些理解

    Prismplayer是一套在线视频播放技术方案 同时支持Flash和Html5两种播放技术 可对播放器进行功能配置和皮肤定制 其在线使用文档地址为 入口 在甘肃交通视频云联网平台中用的就是该播放器 通过抓包发现 播放的是hls的ts流 下
  • mysql存储过程

    CREATE DEFINER root localhost PROCEDURE test BEGIN DECLARE i int DEFAULT 0 DECLARE classSize int DEFAULT 0 SELECT count
  • 给jupter设置新环境

    文章目录 给jupternotebook设置新环境 遇到的报错 添加路径的方法 给jupternotebook设置新环境 先在anaconda界面新建环境 conda env list 查看conda prompt下的有的环境变量 带星号的
  • Vue2使用插件合集

    Quill 插件描述 Vue 富文本编辑器 1 下载 vue quill editor npm i vue quill editor S 2 将vue quill editor引入到main js import VueQuillEditor
  • 任务调度器leetcode621

    问题 来自LeetCode 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表 其中每个字母表示一种不同种类的任务 任务可以以任意顺序执行 并且每个任务都可以在 1 个单位时间内执行完 在任何一个单位时间 CPU 可以完成一