题目叙述

假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1,2,…,n。设计一个优先队列式分支限界法,计算完成这n个任务的最佳调度。
给出输入数据。第1行有2个正整数n和k。第2行的n个正整数是完成n个任务需要的时间。
样例输入

7 3
2 14 4 16 6 5 3

样例输出

17

思路

(仅做参考)
由于题目一定要用优先队列碾过去,中间卡了一下(可能就fw才会卡吧)然后没找到类似的(可能是我太废了,搜索引擎都不会 QAQ),所以来整理一下:
以下例子以样例做参考

1、首先我们先假象3个time值,如下,这3个time值分别代表三个机器的工作时间。

2、然后我们知道所有的事件都必须完成,所以一个事件只有3种状态,在机器1中、在机器2中以及在机器3中。

3、所以我们分别对这三种情况进行判断,判断是否入列。

先给出我对node吧(相关作用都在注释里了)

struct node                                         //定义一个node
{int time[M];                                    //当前的timeint num;                                        //当前的位置int tt;                                         //当前的最大值bool operator<(const node& a)const{return tt > a.tt;}
}point;                                             //当前点

基于以上的基础,就可以写出核心代码了吧

for (int i = 1; i <= k; i++){node next;                          //定义中间变量并赋值next.num = point.num + 1;for (int m = 1; m<= k; m++){next.time[m] = point.time[m];}next.time[i] += x[next.num];next.tt = max(next.time[i], point.tt);if (next.tt < best){                //剪枝q.push(next);}
}

里面其实就分成两个部分,上半部分是赋值,下半部分是剪枝,不断把符合条件的值往优先队列里整,并且通过循环,不断优化结果。

源代码

如果有错误,欢迎大佬们指正

//author:炸鸡柳
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;const int M = 100;
const int INF = 0x3f3f3f3f;
int x[M], n, k;
int best = INF;                                     //最佳值struct node                                         //定义一个node
{int time[M];                                    //当前的timeint num;                                        //当前的位置int tt;                                         //当前的最大值bool operator<(const node& a)const{             //重载运算符,实现优先队列从小到大排列return tt > a.tt;}
}point;                                             //当前点int p_queue(){priority_queue<node> q;for (int i = 1; i <= k; i++){                   //初始化point.time[i] = 0;}point.num = 0;point.tt = 0;while (point.tt < best){                        //不符合退出循环if(point.num == n){best = point.tt;                        //达到最后一点给best赋值}else{for (int i = 1; i <= k; i++){node next;                          //定义中间变量并赋值next.num = point.num + 1;for (int m = 1; m<= k; m++){next.time[m] = point.time[m];}next.time[i] += x[next.num];next.tt = max(next.time[i], point.tt);if (next.tt < best){                //剪枝q.push(next);}}}if(q.empty()){                              //队列无值退出循环return best;}else{                                      //取队列中第一个值进入下一步循环point = q.top();q.pop();}}return best;
}int main(){cin >> n >> k;                                  //输入for (int i = 1; i <= n; i++){cin >> x[i];}cout << p_queue() << endl;                      //输出
}

结果


如果有错误,欢迎大佬们指正,蒟蒻在此谢过了

优先队列式分支限界法,完成这n个任务在k个机器的最佳调度。相关推荐

  1. 单源最短路径-分支限界法-优先队列式分支限界法-Dijkstra

    问题描述: 给定一个带权有向图G = (V, E), 其中每条边的权是非负实数.另外,还给定V中的一个顶点,称为源.现在要计算源到所有其他各定点的最短长度.这里路的长度是指路上各边权之和.这个问题通常 ...

  2. 装载问题-分支限界法(队列式分支限界法,优先队列式分支限界法)

    问题描述  有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且            ∑i=1nwi≤c1+c2\sum^n_{i=1}w_i≤c_1+c_2i=1∑n​ ...

  3. 分支界限算法【0-1背包问题】按照优先队列式(LC)分支限界法求解0-1背包问题, 并给出限界函数,并画出该实例的状态空间树。

    目   录 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 作业题(期末考试必考) 小结 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 解决思路:采用优先队列式分支限界 Ø ...

  4. (流式、lambda、触发器)实时处理大比拼 - 物联网(IoT)\金融,时序处理最佳实践

    标签 PostgreSQL , 物联网 , 传感器 , lambda , 调度 , 实时 , 流式更新 , UPSERT , insert on conflict do update 背景 越来越多的 ...

  5. 算法笔记之分支限界法

    广度优先 广度优先搜索,其实就是层次遍历,程序采用队列来实现. 算法思想 从根开始,常以BF或以最小耗费(即最大收益)优先的方式搜索问题的解空间树.首先将根结点加入活结点表,接着从活结点表中取出根结点 ...

  6. 分支限界法实现最优装载c++_分支限界法

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  7. 最速下降法极小化rosenbrock函数 代码_典型算法思想与应用9|分支限界法与电路布线问题

    分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树. (1) 在分支限界法中,每一个活结点只有一次机会成为扩展结点.活结点一旦成为扩展结点,就一次性产生其所有儿子结点. (2) ...

  8. 分支限界法与回溯法的横向比较

    分支限界法与回溯法的相同点:都是在问题的解空间上搜索问题解的算法,都是一种既带有系统性又带有跳跃性的搜索算法 不同点:1.求解目标不同2.搜索方式不同3.对扩展节点的扩展方式不同4.存储空间的要求不同 ...

  9. 算法设计与分析—分支限界法应用(头歌实验)

    第1关:装载问题 (FIFO 优先队列法) 问题描述 有一批共个集装箱要装上 2 艘载重量分别为 C1 和 C2 的轮船,其中集 装箱 i 的重量为 Wi ,且 装载问题要求确定是否有一个合理的装载方 ...

  10. 用分支限界法求解01背包

    问题描述 0-1背包问题:给定n种物品和一背包.物品i的重量是wi, 其价值为Vi, 背包的容量为C.问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i ...

最新文章

  1. 每日一皮:和女朋友争吵与阅读软件许可协议之间的共同点...
  2. 【版本更新】网易云信IM微信小程序上线啦!
  3. 算法---FaceNet+mtcnn的使用记录
  4. 关于NFS服务器的原理总结和mount挂载
  5. java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字
  6. php对接V免签支付教程_【全网首发】最新版影视小程序搭建教程完整版
  7. Algorithms Part 1-Question 4- SCC 强联通问题
  8. 使用睡袋_宝宝睡袋使用心得
  9. 九章算术卷第三 衰分
  10. linux主机ip数据包抓取,tcpdump和ngrep抓不到本机数据包
  11. Ibatis.Net 数据库操作(四)
  12. db2 sqlcode
  13. 你该知道的杂志分区和影响因子及最新表格下载
  14. windows server 2008安装配置FTP服务器
  15. Laravel中使用GuzzleHttp调用第三方服务的API接口
  16. 树莓派能否替代linux开发板,12 个可替代树莓派的单板机 | Linux 中国
  17. 微信小程序测试点学习、总结
  18. 巧借“中国制造2025”东风占领“智”高点
  19. 德国战车7比1狂胜巴西
  20. phpstorm常见问题

热门文章

  1. 每当我夜深人静的时候下载小电影,总是会卡在百分之九十九,这是正义的制裁么?
  2. html 毛笔书写效果,利用纯SVG+CSS keyframes animation动画实现手写毛笔字(书法)效果...
  3. svchost.exe占网速的解决办法
  4. 使用antd-design-vue配合vue框架搭建项目使用组件显示英文的解决办法
  5. 最简单的让IjkPlayer自动旋转带有rotation视频的方法
  6. ASAN Pass源码分析(六)——全局变量插桩
  7. zoj 1104 Leaps Tall Buildings(超人不会飞- -。。)
  8. CMS内容管理系统(含小程序,Uni APP) 搭建
  9. Excel图表的用法及效果
  10. outlook qr码在哪里_使用python自动发邮件-163、QQ、outlook邮箱