首页 > 其他分享 >力扣-任务调度器

力扣-任务调度器

时间:2023-07-30 12:00:15浏览次数:34  
标签:执行 int len 力扣 include 任务 任务调度 maxExec

1.问题描述

给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

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

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

示例 :

输入:tasks = ["A","A","A","B","B","B"], n = 2

输出:8

解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.

在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。 

说明:

任务的总个数为 [1, 10000]。

n 的取值范围为 [0, 100]。

2.输入说明

首先输入任务的数目len

然后输入len个大写的 A - Z 字母,无空格、无引号

最后输入n

3.输出说明

输出一个整数,表示结果

4.实例

输入:

6
AAABBB
2

输出:

8

5.思路

首先获取任务执行次数最多的任务数(设置为:maxExec),假设这个任务为A,则A执行完所需的时间为:maxExec *(n+1),而在连续A执行过程中,只需要确保下一个A之间的间隙为n,中间随意用其他任务或者空闲填充。

情况1:当maxExec  *(n+1)>=tasks.length

完成所有任务需要的时间为:(maxExec -1)*(n+1)+maxCount

其中maxCount表示:一共有多少个任务和出现次数最大的那个任务次数一样的

情况2:当maxExec  *(n+1)<tasks.length

完成所有任务需要的时间为:tasks.length

因此,首先对tasks计算执行次数最多的任务数,并计算有多少个任务的执行任务数和最多的那个任务数一样,即可根据情况1和情况2进行计算出执行的最短时间。

6.代码

unordered_map 是无序的 map 容器;
max_element() 是用来来查询最大值所在的第一个位置,max_element用于返回最大值的下标,*max_element用来取最大值;
accumulate() 定义在#include<numeric>中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理,下面代码中使用的是自定义类型数据;
#include <iostream>
#include <stdio.h>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
class Solution {
public:
    int leastInterval(vector<char> &v, int n)
    {

        int len=v.size();
        sort(v.begin(),v.end());
        unordered_map<char,int> m;
        char ch;
        //1.计算数组中个任务的个数
        for (int i=0;i<len;i++)
        {
            ch=v[i];
            ++m[ch];
        }
        //2.计算最多执行次数
        int maxExec = max_element(m.begin(), m.end(), [](const auto& u, const auto& v) {
            return u.second < v.second;
        })->second;
        //3.具有最多执行次数的任务数量
        int maxCount = accumulate(m.begin(), m.end(), 0, [=](int acc, const auto& u) {
            return acc + (u.second == maxExec);
        });
        return max((maxExec - 1) * (n + 1) + maxCount, static_cast<int>(v.size()));
    }

};

int main()
{
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    vector<char> v;
    int len,n;
    char data;
    cin>>len;
    for(int i=0; i<len; i++)
    {
        cin>>data;
        v.push_back(data);
    }
    cin>>n;
    int result=Solution().leastInterval(v,n);
    cout<<result<<endl;
    return 0;
}

 

标签:执行,int,len,力扣,include,任务,任务调度,maxExec
From: https://www.cnblogs.com/ohye/p/17591224.html

相关文章

  • 代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转
    链表定义:通过指针串联在一起的线性结构,每一个节点由两个部分组成:数据域和指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null,即为空指针。链表类型1.单链表2.双链表3.循环链表,即链表首尾相连,可以解决约瑟夫环问题链表的存储方式数组在内存中是连续分布的,......
  • 力扣---77. 组合
    给定两个整数 n 和 k,返回范围 [1,n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 示例1:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]示例2:输入:n=1,k=1输出:[[1]] 提示:1<=n<=201<=k<=n......
  • 力扣---141. 环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • 力扣-设置交集大小至少为2
    1.问题描述一个整数区间[a,b] (a<b)代表着从a到b的所有连续整数,包括a和b。给你一组整数区间intervals,请找到一个最小的集合S,使得S里的元素与区间intervals中的每一个整数区间都至少有2个元素相交。输出这个最小集合S的大小。示例1:输入:intervals=[[1......
  • Quartz任务调度快速入门
    了解Quartz体系结构Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述:●Job:是一个接口,只有一个方法voidexecute(JobExecutionContextcontext),开发者实现该接口定义运行任务,JobExe......
  • 任务调度占位符说明
    摘要介绍任务调度占位符的格式,例如*/1****一、任务调度占位符说明五个占位符的说明符号含义范围第一个"*"一小时当中的第几分钟0-59第二个"*"一天当中的第几小时0-23第三个"*"一天当中的第几天1-31第四个"*"一年当中的第几月1-12第五......
  • linux crond任务调度
    摘要介绍linux的任务调度机制介绍任务调度指令crontab举例crontab进行任务调度的例子一、linux任务调度任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等个别用户工作:个别用户可能希望执行某......
  • 使用 Apache DolphinScheduler 进行 EMR 任务调度
    ByAWSTeam前言随着企业规模的扩大,业务数据的激增,我们会使用Hadoop/Spark框架来处理大量数据的ETL/聚合分析作业,⽽这些作业将需要由统一的作业调度平台去定时调度。在AmazonEMR中,可以使用AWS提供StepFunction,托管AirFlow,以及ApacheOozie或Azkaban进行作业的......
  • Vue任务调度。
    1、作用vue中一个非常重要的功能,批量更新或者叫异步更新响应式数据发生变化出发副作用函数重新执行时,我们有能力去决定副作用函数的执行时机、次数和方式。2、例子conststate=reactive({num:1})effect(()=>{console.log('num',state.num)})state.num++c......
  • 力扣---42. 接雨水
    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨水)。......