Task Scheduler

问题:

Given a char array representing tasks CPU need to do. It contains capital letters A to Z where different letters represent different tasks.Tasks could be done without original order. Each task could be done in one interval. For each interval, CPU could finish one task or just be idle.

However, there is a non-negative cooling interval n that means between two same tasks, there must be at least n intervals that CPU are doing different tasks or just be idle.

You need to return the least number of intervals the CPU will take to finish all the given tasks.


代码:

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        // frame size
        vector<int> mVec(26,0);


        for(auto &val:tasks) {
            mVec[val-'A']++;
        }
        sort(mVec.begin(),mVec.end());
        int i = 25;
        while(i>=0&&mVec[25]==mVec[i])i--;
        return max((mVec[25]-1)*(n+1)+25-i,static_cast<int>(tasks.size()));
    }
};

对于两个相同的task,我们假设都为A,两者之间的最小间隔是n,这就是题目想表达的含义,我们首先考虑出现频率最高的task,我们仍假设为A,出现的频率为x,我们知道,要满足A的时间需求,我们至少应该有 x-1个n的间隔。对于频率小于x的任务,假设为B,我们按序插入任务B,可以发现,这样的插入也是满足要求的。满足A的最小安排,最终所有的任务安排都是满足要求的(先不考虑任务多得插不进去的情况)。 
因为出现频率最高的元素可能不止一个,我们假设为k个,那么这种情况下最终的时间需求为: 
(x-1)*n+k

若出现完全插满的情况,上式仍然成立,但显然,多余的task没有计算。这时候我们观察形成的序列,如果完全插满,这时候的时间需求显然就是整个数组的大小了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值