力扣练习——17 任务调度器

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]。

 

可参考以下main函数:

int main()

{

    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;

}

 

2.输入说明

首先输入任务的数目len

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

最后输入n

 3.输出说明

输出一个整数,表示结果

4.范例

输入

6
AAABBB
2

输出

8

5.代码

复制代码
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;

bool compare(int x, int y)
{
    return x > y ;
}


int leastInterval(vector<char>tasks, int n)
{  //思想:桶思想,建立大小为 n+1 的桶子,个数为任务数量最多的那个任务
    //参考https://leetcode.cn/problems/task-scheduler/solution/tong-zi-by-popopop/
    //1.对所有任务出现个数进行排序
    //int len = tasks.size();//获取任务总数
    vector<int>vec(26);//用于记录每个任务出现的次数
    for (int i = 0; i < tasks.size(); i++)
    {
        vec[tasks[i] - 'A']++; //巧妙统计每个字符出现的次数
    }
    
    sort(vec.begin(), vec.end(), compare);//注意这边compare函数的编写,要用bool返回比较情况 ,此处为降序排列

    //2.计算最后一个桶子的任务数x
    int cnt = 1;//用于计算最后一个桶子的任务数x
    while (cnt < vec.size()&& vec[cnt] == vec[0])//注意不要陷入死循环中,vec[cnt]==vec[0]必须在while()中,否则会死循环//while (cnt < vec.size())
    {                                                                                                                    //{  if(vec[cnt]==vec[0]) cnt++;}
                                               
       //vec[0]存储的是在所有任务中的最大任务数量N,通过计算之后的vec[1],vec[2]etc中任务次数和vec[0]相等的个数,计算x
            cnt++;
    }
    int x = cnt;
    int N = vec[0];
    //3.比较NUM1和NUM2大小,NUM1=(N-1)*(n+1)+x;  NUM2=tasks.size(); 返回最大者
    int NUM1 = (N - 1)*(n + 1) + x;
    int NUM2 = tasks.size();
    return max(NUM1, NUM2);
}
int main()

{

    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 = leastInterval(v, n);

    cout << result << endl;

    return 0;

}
复制代码

 

posted @   努力奋斗的小企鹅  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示