当前位置: 首页 > news >正文

【优先级队列】任务分配

任务分配问题,有n个任务,每个任务有个达到时间。将这些任务分配给m个处理器,进行处理。每个处理器的处理时间不一样。处理器的任务列表有最大任务数限制。
分配任务的策略是:当前待分配的任务的处理时刻最小。如果处理时刻相同,处理器id小的优先。
假设从时刻0开始分配任务和处理任务。在某一时刻,要求处理器先标记任务的完成状态,再接受新的任务。
问所有问题处理完毕后的时刻是多少?

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <string>
#include <queue>
using namespace std;

class Solution
{
public:
    int Dispatch(vector<int> timeUnit, vector<int> arriveTimeList, int queueLen)
    {
        int n = timeUnit.size();
        this->timeUnit = timeUnit;
        this->queueLen = queueLen;
        taskTime.resize(n, 0);
        taskCount.resize(n, 0);
        auto cmp = [&] (int x, int y) -> bool {
            if (taskCount[x] == queueLen && taskCount[y] == queueLen) {
                return x > y;
            }
            if (taskCount[x] == queueLen) {
                return true;
            }
            if (taskCount[y] == queueLen) {
                return false;
            }
            int time1 = taskTime[x] + timeUnit[x] * taskCount[x];
            int time2 = taskTime[y] + timeUnit[y] * taskCount[y];
            if (time1 == time2) {
                return x > y;
            }
            return time1 > time2;
        };
        int j = 0;
        int curTime = 0;
        for (; ; curTime++) {
            priority_queue<int, vector<int>, function<bool(int,int)>> q(cmp);
            // 出队
            for (int i = 0; i < n; i++) {
                if (taskCount[i] == 0) {
                    q.push(i);
                    continue;
                }
                int cnt = (curTime - taskTime[i]) / timeUnit[i];
                taskCount[i] -= cnt;
                if (taskCount[i] < 0) {
                    taskCount[i] = 0;
                    taskTime[i] = 0;
                } else {
                    taskTime[i] += cnt * timeUnit[i];
                }
                q.push(i);
            }
            int task = q.top();
            // 入队,直到不能再加了
            while (j < arriveTimeList.size() && arriveTimeList[j] <= curTime && taskCount[task] < queueLen) {
                q.pop();
                taskCount[task]++;
                if (taskCount[task] == 1) {
                    taskTime[task] = curTime;
                }
                j++;
                q.push(task);
                task = q.top();
            }
            if (j == arriveTimeList.size()) {
                break;
            }
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            ans = max(ans, taskTime[i] + taskCount[i] * timeUnit[i]);
        }
        return ans;
    }
private:
    vector<int> taskTime;
    vector<int> taskCount;
    vector<int> timeUnit;
    int queueLen;
};

int main(int argc, char *argv[])
{
    vector<int> timeUnit = {1, 2, 3, 4, 5};
    vector<int> arriveTimeList = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7};
    int rightAns = 5;
    Solution s;
    int ans = s.Dispatch(timeUnit, arriveTimeList, 3);
    cout << "ans: " << ans << endl;
    return 0;
}

相关文章:

  • sentinel集成nacos做持久化配置
  • rk3576上部署deepseek
  • systemverilog刷题小记
  • CodeGPT 使用教程(适用于 VSCode)
  • Kafka 简介
  • 波导阵列天线 学习笔记9 使用紧凑高效率馈网的宽带圆极化阵列天线
  • 【面试题】2025.02.19-前端面试题汇总
  • 图论(四):图的中心性——度中心性介数中心性紧密中心性
  • 学习总结2.19
  • 【小白学HTML5】一文讲清常用单位(px、em、rem、%、vw、vh)
  • “深入浅出”系列之C++:(24)ZeroMQ库
  • 炫酷动效登录页
  • DeepSeek学术指南:DeepSeek在文献综述中的能力分享!
  • 练习题 - DRF 3.x Parsers 解析器使用示例和配置方法
  • golang--字符串处理(runeleixing )
  • Idea24.3 如何设置Git忽略某一个文件
  • Luckfox Pico Max运行RKNN-Toolkit2中的Yolov5 adb USB仿真
  • Winform(C#) 项目保存页面
  • 写一个python组件
  • 基于Springboot的网上服装商城系统【附源码】
  • 网红街区如厕难,如何多管齐下补缺口?
  • 巴基斯坦空袭印度多地空军基地,巴战机进入印领空
  • 教育部答澎湃:2025世界数字教育大会将发布系列重磅成果
  • 国家卫健委:有条件的二级及以上综合医院要开设老年医学科
  • 吴勇强、高颜已任南京市委常委
  • 巴基斯坦军方:印度袭击已致巴方31人死亡