问题(来自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

(图来自leetcode)

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

(图来自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);}
};

任务调度器leetcode621相关推荐

  1. LeetCode-621. 任务调度器

    621. 任务调度器 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时 ...

  2. 基于单片机的简单的任务调度器

    近来工作之余,研究了一下APM的源码. APM源码连接https://pan.baidu.com/s/17Dg1oEJT_fj12DM1BmZWxA 发现源码中有一个简单的任务调度器,不太重要的任务都 ...

  3. java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...

    折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...

  4. 从零入门 FreeRTOS 操作系统之任务调度器

    从零入门 FreeRTOS 操作系统之任务调度器 1 任务调度器的概念 FreeRTOS 中提供的任务调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是 ...

  5. 面试八股文:你写过自定义任务调度器吗?

    最近入职了新公司,尝试阅读祖传代码,记录并更新最近的编程认知. 思绪由Q1引发,后续Q2.Q3基于Q1的发散探究 Q1. Task.Run.Task.Factory.StartNew 的区别? 我们常 ...

  6. 昇腾AI处理器软件栈--任务调度器(TS)

    任务调度器与运行管理器工程组成软硬件之间的大坝系统.在执行时,任务调度器对硬件进行任务的驱动,为昇腾AI处理器提供具体的目标任务,与运行管理器一起完成任务调度流程,并将输出数据回送给运行管理器,充当了 ...

  7. 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  8. TaskScheduler一个.NET版任务调度器

    TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式 ...

  9. 【Hadoop2.6】Yarn中任务调度器

    概述 Yarn中有三种任务调度器:FIFO调度器(FIFO Scheduler).容量调度器(Capacity Scheduler).公平调度器(Fair Scheduler). 任务调度器介绍 1. ...

最新文章

  1. 什么是TypeScript?为什么我要用它代替JavaScript? [关闭]
  2. python读取excel表格-python读写Excel表格的实例代码(简单实用)
  3. C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎
  4. 如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库
  5. (王道408考研数据结构)第六章图-第四节7:关键路径(最早发生时间、最迟发生时间)
  6. 递归算法的总结与应用
  7. 股票休市午间可以撤单吗?
  8. Redis高可用之持久化
  9. 开发商微信选房后不退认筹金_新楼盘开盘的“认筹”和“认购”,劝您看懂后再去认!...
  10. dnn305的一个bug
  11. php获取qq音乐的api类,QQ音乐api接口梳理
  12. 富文本编辑器CKEditor配置与使用
  13. excel自动求和_Excel里面SUM函数增加行后数据自动加进去的方法
  14. Crate安装和配置
  15. 2020最新手机百度云不限速教程,下载速度10M/S,比会员还快
  16. 认识计算机选题背景,与计算机专业相关的论文_计算机专业的毕业论文题目有哪些_大一我对计算机的认识3000字论文...
  17. 推荐10本C#编程的最佳书籍
  18. python的argc与argv
  19. 汇编语言快速回顾(以x86_64为例)
  20. html2canvas解决图片空白,网络图片跨域

热门文章

  1. 这份“插件英雄榜Top20”才是Chrome的正确打开方式!
  2. 代码测试意味着完全消灭了Bug?
  3. 搜狗上线海外权威健康搜索 支持中英双语一键切换
  4. 老板说我最近飘了,都敢用 MySQL 实现分布式锁了
  5. Spring Boot实现定时任务的动态增删启停
  6. 没有这 29 款插件的 Chrome 是没有灵魂的!
  7. SQL 查询总是先执行SELECT语句吗?你们都错了!
  8. IDEA万能快捷键,你必须知道的17个实用技巧,提升撸码效率!
  9. Spring Cloud Sleuth 进阶实战
  10. 2022 AI趋势8大预测!