621. Task Scheduler

给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成。但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位。球最少数量的时间单位完成所有任务。

我的思路:

贪心的方法:考虑不周全,只能通过

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        priority_queue<point> q;
        map<char,int> temp;
        for(auto s:tasks)
            temp[s]++;
        for(auto s:temp)
        {
             q.push({s.first,s.second});
        }
           
        point top=q.top();
        if(temp.size()==1)
            return (top.x-1)*n+tasks.size();
        vector<int> interval(n+1,top.x-1);
        int i=1;
        q.pop();
        int re=0;
        while(!q.empty())
        {
            if(interval[n]==0) break;
            point cur=q.top();
            q.pop();
                if(interval[i]>cur.x+re)//当前标号间隙填不满
                    interval[i]-=cur.x;   
                else//当前标号间隙能够填满
                {
                    if(cur.x<top.x)re=cur.x+re-interval[i];//将当前标号填满,可能还剩余一些字母
                    else re=0;
                    interval[i]=0;
                    i++;
                }
        }
        return accumulate(interval.begin()+1,interval.end(),0)+tasks.size();
    }
    struct point{
        char a;
        int x;
        friend bool operator<(const point& i,const point& j){
            return i.x<j.x;
        }
    };
};




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值