【a603】加工生产调度
Time Limit: 1 second
Memory Limit: 32 MB
【问题描述】
某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
【输入格式】
共三行。
第一行仅一个数据n(0<n<1000),表示产品的数量。
第二行,n个数据,表示这n个产品在A车间加工各自所要的时间(都是整数)。
第二行,n个数据,表示这n个产品在B车间加工各自所要的时间(都是整数)。
【输出格式】
共两行。第一行一个数据,表示最少的加工时间;第二行是一种最小加工时间的加工顺序。
【输入样例】
5
3 5 8 7 10
6 2 1 4 9
【输出样例】
34
1 5 4 2 3
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=a603
【题意】
【题解】
贪心;
因为B机器在工作的时候,A机器还能够工作;
所以就这样;
对于A机器;
先找一个在A机器上加工时间短的产品;
让它在机器上加工完
尽早让B机器开始工作;
这样B机器和A机器它们的空闲时间就会最短了;
同时让B机器优先加工的产品时间尽量长一点;
这样同时在A机器上加工的产品就会尽可能地多;
总之就是让A机器和B机器的空闲时间尽可能地短;
/*
先找一个在A机器上加工时间短的产品;
同时让B机器优先加工的产品时间尽量长一点;
*/
上面这两句话就是关键了;
按照这个原则;
处理出m[i]=min(a[i],b[i]);
然后把m数组升序排;
然后顺序处理n个m[i];
如果m是由a数组搞来的,就放在数据的最前(如果前面有元素了就尽可能靠前,否则放在序列的最后(如果最后也有元素了就尽量靠后);
如样例,N=5
(A1,A2,A3,A4,A5)=(3,5,8,7,10)
(B1,B2,B3,B4,B5)=(6,2,1,4,9)
则(m1,m2,m3,m4,m5)=(3,2,1,4,9)
排序之后为(m3,m2,m1,m4,m5)
处理m3:因为m3=B3,所以m3排在后面;加入m3之后的加工顺序为( , , , ,3);
处理m2:因为m2=B2,所以m2排在后面;加入m2之后的加工顺序为( , , ,2,3);
处理m1:因为m2=A1,所以m1排在前面;加入m1之后的加工顺序为(1, , ,2,3);
处理m4:因为m4=B4,所以m4排在后面;加入m4之后的加工顺序为(1, ,4,2,3);
处理m5:因为m5=B5,所以m5排在后面;加入m5之后的加工顺序为(1,5,4,2,3);
则最优加工顺序就是(1,5,4,2,3),最短时间34。显然这是最优解。
然后根据序列模拟出总的时间就好;
(B机器在工作的时候,A机器也可以继续加工其他产品哦);
【完整代码】
//#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1100;
struct abc
{
int x, id,sx;
};
abc m[N];
int A[N],B[N], n, xl[N];
void px()
{
rep1(i, 1, n-1)
rep1(j,i+1, n)
if (m[i].x > m[j].x)
swap(m[i], m[j]);
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
rei(n);
rep1(i, 1, n)
rei(A[i]);
rep1(i, 1, n)
rei(B[i]);
rep1(i, 1, n)
{
m[i].x = min(A[i], B[i]);
m[i].id = i;
if (A[i] <= B[i])
m[i].sx = 1;
else
m[i].sx = 2;
}
px();
int l = 1, r = n;
rep1(i, 1, n)
{
if (m[i].sx == 1)
xl[l++] = m[i].id;
else
xl[r--] = m[i].id;
}
int po = 1,time = 0,j = 2;
time += A[xl[po]];
while (1)
{
if (po > n && j > n) break;
if (j>n)
{
rep1(j, po, n)
time += B[xl[j]];
break;
}
if (A[xl[j]]<B[xl[po]])
{
time += A[xl[j]];
B[xl[po]] -= A[xl[j]];
A[xl[j]] = 0;
j = j + 1;
}
else
{
//A[xl[j]]>=B[xl[po]];
time += B[xl[po]];
A[xl[j]] -= B[xl[po]];
B[xl[po]] = 0;
po++;
if (A[xl[j]] == 0) j++;
if (po == j)
{
time += A[xl[j]];
A[xl[j]] = 0;
j++;
}
}
}
printf("%d\n", time);
rep1(i, 1, n)
{
printf("%d", xl[i]);
if (i == n)
puts("");
else
putchar(' ');
}
return 0;
}
【a603】加工生产调度的更多相关文章
- codevs 3008 加工生产调度[贪心]
3008 加工生产调度 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 某工厂收到了n个产品的订 ...
- 加工生产调度(prod)
加工生产调度(prod) 题目描述 有n个部件需在A.B机器上加工,每个工件都必须经过先A后B两道工序. 已知:部件i在A.B机器上的加工时间分别为ai,bi. 问:如何安排n个工件的加工顺序,才能使 ...
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- 洛谷P1248 加工生产调度
流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...
- 【题解/模板】P1248 加工生产调度(贪心)
[题解/模板]P1248 加工生产调度(贪心) 分析: \(A\)流水线的时间是确定的,所以现在就是要让\(b\)的时间尽量短 \(tB > tA\),除非所有东西都不需要\(b\).(t指结束 ...
- 「一本通 1.1 例 4」加工生产调度(贪心算法)(luogu P1248)题解
加工生产调度 题目描述 某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i i i 在 A. ...
- 【洛谷P1248】加工生产调度
题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序, ...
- Codevs3008 加工生产调度
题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,而且必须先在A车间加工后才干够到B车间加工. 求如何安排这n个产品的加工顺序.才干使总的加工时间最短. 这里所说的加工时间是指 ...
- CODEVS——T3008 加工生产调度
http://codevs.cn/problem/3008/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
随机推荐
- 11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方式。
<span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</s ...
- POJ 2536 Gopher II (ZOJ 2536) 二分图匹配
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1882 http://poj.org/problem?id=2536 题目大 ...
- (转)kvm虚拟机中,如何给子系统更换光盘
转自:http://www.cnblogs.com/york-hust/archive/2012/06/12/2546334.html 启动kvm后,在kvm窗口中,按下CTRL+ALT+2,切换至q ...
- GO语言学习(六)Go 语言数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- 读<阿里亿级日活网关通道架构演进>有感
读<阿里亿级日活网关通道架构演进>时对优化方法有些概念不理解,特意搜索了一下,拓展自己的思路. 其中的优化: 优化方法中1,2比较常见,3,4我知道的比较少,很感兴趣.就继续追踪下去: 于 ...
- LA 3644 - X-Plosives ( 也即UVA 1160)
LA看题 请点击:传送门 UVA 上也有这题 :UVA 1160 - X-Plosives 题目大意就是如果车上存在 k 个简单化合物,正好包含 k 种元素 ,那么它们将有危险,此时你应该拒绝装车. ...
- 安装spark1.3.1单机环境 分类: B8_SPARK 2015-04-27 14:52 1873人阅读 评论(0) 收藏
本文介绍安装spark单机环境的方法,可用于测试及开发.主要分成以下4部分: (1)环境准备 (2)安装scala (3)安装spark (4)验证安装情况 1.环境准备 (1)配套软件版本要求:Sp ...
- 【BZOJ 3156】防御准备
[链接] 链接 [题意] 在这里输入题意 [题解] 把a倒过来 设f[i]表示在i放一个防御塔的最小花费; 我们如果从j转移过来 就表示j+1..i-1这一段放人偶. s[i] = 1 + 2 + . ...
- php实现判断树的子结构
php实现判断树的子结构 一.总结 很简单的递归判断 二.php实现判断树的子结构 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 三.代码 代 ...
- AngularJS之ng-options指令
1.基本下拉效果(lable for value in array) 其中select标签中的ng-model属性必须有,其值为选中的对象或属性值. <div ng-controller=&qu ...