贪心算法(4.加工生产调度(做题思路分析))
1、流水作业调度问题(解题思路在下边)
加工生产调度
题目描述:
某工厂收到了 个产品的订单,这 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 在 A,B 两车间加工的时间分别为 。怎样安排这 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。
输入格式
第一行仅—个数据 ,表示产品的数量;
接下来 个数据是表示这 个产品在 A 车间加工各自所要的时间;
最后的 个数据是表示这 个产品在 B 车间加工各自所要的时间。
输出格式
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
样例
样例输入
5 3 5 8 7 10 6 2 1 4 9
样例输出
34 1 5 4 2 3
做题思路:
求一个加工顺序,使得加工时间最短。A机器开始加工以后,直到加工完毕才会停下来。因为必须先在A加工,所以有两个特殊的位置,A加工第一个的时候,B在等待;B加工做后一个的时候,A在等待:只有等B加工完了,任务才算结束。
所以,就要把A机器加工时间最短的部件最先加工,把B机器加工时间最短的部件,最后加工。
举例:
集合ai = {3、5、 8、7、10}
集合bi = {6、2、1、4、9}
集合 mi = min{ai,bi} {m1,m2,m3,m4,m5}= {3、2、1、4、9}
排序:{m3,m2,m1,m4,m5} = {1,2,3,4,9}
扫描集合mi,一次判断集合里的元素是属于ai集合,还是bi集合,
如:m3 = 1, 1是b集合元素,放在末尾{ , , , ,3}
m2 = 2, 2是b集合元素,放在末尾的前一个{ , , , 2,3}
m1 = 3, 3是a集合元素,放在第一个位置{ 1, , , 2,3}
... ...
切结:放入新集合的是下标。
如果是ai集合,从前往后依次放,如果是bi集合,从后往前依次放,
最后得到的集合是{1、5、4、2、3},此为最优加工顺序。
例题:https://loj.ac/problem/10003(加工生产调度)
AC代码:
#include<bits/stdc++.h>using namespace std; struct node {int sign,date,num; }; node s[1005]; int a1[1005],b1[1005],c[1005]; int cmp(const node &a,const node &b) {return a.date<b.date; } int main() {int n;scanf("%d",&n);for(int i = 1; i <= n; i++)scanf("%d",&a1[i]);for(int i = 1; i <= n; i++)scanf("%d",&b1[i]);for(int i = 1; i <= n; i++){if(a1[i]<=b1[i]){s[i].sign = 0;//标记是集合As[i].date = a1[i];//保存么你数据s[i].num = i;//记录位置}else{s[i].sign = 1;s[i].date = b1[i];s[i].num = i;}}sort(s+1,s+n+1,cmp);//数据排序int a=1,b=n;for(int i = 1; i <= n; i++){//将排序后的下标存储到C数组if(s[i].sign == 0)c[a++]=s[i].num;elsec[b--]=s[i].num;}int t = a1[c[1]];//加工第一个for(int i = 2; i <= n; i++){//时间统计,如果当前a1加工完,前一个b1还没加工完,if(a1[c[i]]<b1[c[i-1]])//就把没加完的时间累积到当前b1上,假设a1加工完,b1[c[i]] += (b1[c[i-1]]-a1[c[i]]);//上一个b1也刚好加工完,这样超出的时间,都累积到最后的b1上。t += a1[c[i]];//a机器一直在运作}t += b1[c[n]];//将最后累加在一起的时间加上printf("%d\n",t);int flag = 0;for(int i = 1; i <= n; i++){if(flag++)//防止数据末尾输出空格printf(" %d",c[i]);elseprintf("%d",c[i]);}printf("\n");return 0; }
经典的题,做一道少一道!
贪心算法(4.加工生产调度(做题思路分析))相关推荐
- 已知分布函数求概率密度例题_初二一次函数知识点及做题思路解析,一次函数不好的同学看一看...
初二从平行四边形部分过渡到一次函数部分.很多同学明显感觉一次函数部分比前面平行四边形几何部分简单了一些.前边平行四边形几何部分没有学好的同学,这一部分只要好好学,期末还是能考一个不错的分数.虽然,感觉 ...
- ctf-web--总结几点基础题的做题思路
做了三天web题了,因为刚入门,还是不要做得太快,先把前几天学到的好好总结一下,主要是做了几道bugku上的web题和合天网安的几道web题,这篇博客先写一些自己的收获,后面再写两篇writeup复习 ...
- 2022国赛数学建模A题B题C题思路分析 高教社杯
一.思路分析 A题思路分析: (比赛开始后第一时间发布) B题思路分析: (比赛开始后第一时间发布) C题思路分析: (比赛开始后第一时间发布) 二.建模资料免费领取 数模君多次参加国赛.美赛.深圳杯 ...
- c语言贪心算法合并箭,LeetCode刷题题库:贪心算法
LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...
- 学习笔记 - 动态规划做题思路
目录 一 . 什么是动态规划? 二.什么问题能用动态规划? 三.动态规划思路 一 . 什么是动态规划? 上一篇文章已经讲了动态规划是什么,按我个人的理解来说 动态规划就是一种 将一个大问题分解为各个独 ...
- 贪心算法及Jump Game系列题详解
本博文所有的代码均可在 https://github.com/Hongze-Wang/LeetCode_Java https://github.com/Hongze-Wang/LeetCode_Pyt ...
- 【2020数模F奖】 美赛C题参赛感受及做题思路记录【编程手的角度,含大量代码及参考链接】
目录 写在前面的话 题目分析 [数据清洗] [NLTK] [第一题] [第2题e问] [词云]---wordcloud包 [TF-IDF算法] [第2题a.b.c问]需要先对评论数值化 [Textbl ...
- leetcode 贪心_利用贪心算法解LeetCode第1253题:重构2行二进制矩阵
题目描述 给你一个 2 行 n 列的二进制数组:矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1.第 0 行的元素之和为 upper.第 1 行的元素之和为 lower.第 i 列(从 ...
- 系统架构设计师(截图+做题思路+目录)
目录 文章目录 目录 系统架构设计师考试介绍 计算机组成与体系结构 计算机体系结构分类-Flkynn CISC与RISC的区别 层次化存储结构 Cache 局部性原理 主存-分类 磁盘结构与参数 磁盘 ...
最新文章
- 深度学习LiDAR定位:L3-Net
- 只有ajax会跨域吗_ajax处理跨域有几种方式
- 生产环境LNMP (果图片)
- android adb常用指令
- fir.im Weekly - APP 性能监测优化 二三事
- c++和Python之rfind不同
- 计算机网络基础(缩短版)
- ***学习笔记教程五:***技术
- Android下强制打开键盘
- UVA10494 If We Were a Child Again【大数除法】
- php 图像居中裁剪函数,PHP 实现的自定义图像居中裁剪函数示例
- 获取设备的sn号,mac地址以及IP地址
- 从qire123上抓取bdhd下载地址的firefox extension
- css设置单行文本超出部分点点点、多行文本超出部分点点点(两种方法)/解决多行 数字不换行问题。
- Servlet【黑马】
- 安卓使用usb连接外设
- Elasticsearch优秀的索引设置技巧
- 安卓视频播放,部分手机不能快进
- Ubuntu 修改用户名
- 私人定制外贸精准获客产品 外贸智能获客系统 好选客