当前位置: 首页 > 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;
}
http://www.lryc.cn/news/539538.html

相关文章:

  • 设计模式之适配模式是什么?以及在Spring AOP中的拦截器链的使用源码解析。
  • Python 库自制 Cross-correlation 算法
  • C++(23):为类成员函数增加this参数
  • javaSE学习笔记23-线程(thread)-总结
  • 【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库
  • 【JAVA工程师从0开始学AI】,第四步:闭包与高阶函数——用Python的“魔法函数“重构Java思维
  • 算法日记20:SC72最小生成树(prim朴素算法)
  • 玩转SpringCloud Stream
  • 嵌入式经常用到串口,如何判断串口数据接收完成?
  • iOS App的启动与优化
  • 导出指定文件夹下的文件结构 工具模块-Python
  • Leetcode - 周赛436
  • 【pytest】编写自动化测试用例命名规范README
  • Compose常用UI组件
  • 斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)
  • Hackthebox- Season7- Titanic 简记 [Easy]
  • Sa-Token 根据官方文档简单实现登录认证的示例
  • rustdesk编译修改名字
  • BS5852英国家具防火安全条款主要包括哪几个方面呢?
  • 【运维】源码编译安装cmake
  • 检测网络安全漏洞 工具
  • frameworks 之 Activity添加View
  • UWB技术中的两种调制方式:PPM与PAM
  • 达梦:用户和模式
  • 23. AI-大语言模型-DeepSeek
  • Spring-GPT智谱清言AI项目(附源码)
  • 计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
  • 云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色
  • 《运维工程师如何利用DeepSeek实现智能运维:分级实战指南》
  • windows事件倒计时器与提醒组件