任务计划程序n C ++

假设我们有一个char数组,表示CPU需要完成的任务。它包含大写字母A到Z,其中不同的字母代表不同的任务。无需原始命令即可完成任务。每个任务可以在一个时间间隔内完成。对于每个间隔,CPU可以完成一项工作或只是处于空闲状态。但是,存在一个称为n的非负冷却间隔,这意味着在两个相同的任务之间,CPU必须至少有n个间隔执行不同的任务或只是处于空闲状态。我们必须找到CPU完成所有给定任务所需的间隔最少。因此,如果输入为[A,A,A,B,B,B]且n为2,则输出将为8,因为A→B→空闲→A→B→空闲→A→B

为了解决这个问题,我们将遵循以下步骤-

  • 创建一个映射m,并存储任务数组中存储的所有字符的频率

  • 定义优先级队列pq

  • 对于m处存在的每个键值对,将频率值插入pq

  • ans:= 0,循环:= n + 1

  • 当pq不为空时

    • 将temp [i]降低1

    • 如果temp [i]不为0,则将temp [i]插入pq

    • 将pq的top元素插入temp,从pq删除top,将temp增加1

    • 定义数组温度,设置时间:= 0

    • 因为我在0范围内且pq不为空,并且i-

    • 对于我在0到温度范围内的范围

    • ans:= ans + pq为空的时间,否则循环

    • 返回ans

    例子(C ++)

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int leastInterval(vector<char>& t, int n) {
          map <char,int> m;
          for(int i =0;i<t.size();i++){
             m[t[i]]++;
          }
          map <char, int> :: iterator i = m.begin();
          priority_queue <int> pq;
          while(i != m.end()){
             pq.push(i->second);
             i++;
          }
          int ans = 0;
          int cycle = n + 1;
          while(!pq.empty()){
             vector <int> temp;
             int time = 0;
             for(int i = 0; !pq.empty() && i < cycle; i++){
                temp.push_back(pq.top());
                pq.pop();
                time++;
             }
             for(int i = 0;i < temp.size(); i++){
                temp[i]-- ;
                if(temp[i])pq.push(temp[i]);
             }
             ans += pq.empty()? time : cycle;
          }
          return ans;
       }
    };
    main(){
       vector<char> v = {'A','A','A','B','B','B'};
       Solution ob;
       cout << (ob.leastInterval(v, 2)) ;
    }

    输入值

    {'A','A','A','B','B','B'}
    2

    输出结果

    8