CODEVS——T3008 加工生产调度

http://codevs.cn/problem/3008/

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

查看运行结果

题目描述 Description

某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。

某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。

输入描述 Input Description

第一行仅—个数据n(0<n<1000),表示产品的数量。

接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。

最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。

输出描述 Output Description

第一行一个数据,表示最少的加工时间;

样例输入 Sample Input

5

3 5 8 7 10

6 2 1 4 9

样例输出 Sample Output

34

数据范围及提示 Data Size & Hint

0<n<1000

分类标签 Tags 点此展开

贪心

Johnson算法——流水作业

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 const int N(1000+15);
 7 int n,a[N],b[N];
 8
 9 struct Node
10 {
11     int num,tim,a_b;//工作编号,用时,机器号
12     bool operator < (const Node &x) const
13     { return tim<x.tim; }//最短时间
14     Node(int num=0,int tim=0,int a_b=0):
15         num(num),tim(tim),a_b(a_b){}
16 }job[N];
17 int ans,num[N],sum[N];
18 void Johnson()
19 {
20     for(int i=1;i<=n;i++)
21         if(a[i]<b[i]) job[i]=Node(i,a[i],0);
22         else job[i]=Node(i,b[i],1);
23     sort(job+1,job+n+1);
24     for(int l=0,r=n+1,i=1;i<=n;i++)//得到最优解
25         if(job[i].a_b==0) num[++l]=job[i].num;
26         else num[--r]=job[i].num;
27 }
28
29 int main()
30 {
31     scanf("%d",&n);
32     for(int i=1;i<=n;i++) scanf("%d",a+i);
33     for(int i=1;i<=n;i++) scanf("%d",b+i);
34     Johnson();
35     for(int i=1;i<=n;i++) sum[i]+=sum[i-1]+a[num[i]];
36     ans=sum[1]+b[num[1]];
37     for(int i=2;i<=n;i++) ans=max(sum[i],ans)+b[num[i]];
38     printf("%d\n",ans);
39     return 0;
40 }
时间: 2024-11-04 18:21:49

CODEVS——T3008 加工生产调度的相关文章

加工生产调度(prod)

加工生产调度(prod) 题目描述 有n个部件需在A.B机器上加工,每个工件都必须经过先A后B两道工序. 已知:部件i在A.B机器上的加工时间分别为ai,bi. 问:如何安排n个工件的加工顺序,才能使得总加工时间最短? 输入 第1行仅一个整数n (0<n<1000),表示产品的数量: 第2行n个整数,表示这n个产品在A车间加工各自所要的时间(都是整数): 第3行n个整数,表示这n个产品在B车间加工各自所要的时间(都是整数). 输出 只有一个数,表示最少的加工时间: 样例输入 5 3 5 8 7

Codevs3008 加工生产调度

题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.求怎样安排这n个产品的加工顺序,才能使总的加工时间最短.这里所说的加工时间是指,从开始加工第一个产品到最后所有的产品都已在A.B两车间加工完毕的时间. 思路:显然,如果产品开始生产,那么A生产线是肯定不会停止运转的,反而是B生产线有可能要等待A生产线,这样我们就需要B的运转时间最小.进一步分析,B生产线的等待时间来源有:当第一件产品加工时所需的时间.最后一件产品在B上加工时间最短

加工生产调度

Johnson排序 思路使用邻项交换法证明,以min(a1,a2)<min(b1,b2)为关键字排序. 注意细节 #include<bits/stdc++.h> using namespace std; int n,aa,ab,ans[1005]; struct node{int a,b,ind;}x[1005]; bool cmp(node a,node b){return min(a.a,a.b)<=min(b.a,b.b);}//以min(a.a,a.b)<=min(b

P1248 加工生产调度

题目描述 某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工. 某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序,才能使总的加工时间最短.这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A.B两车间加工完毕的时间. 输入格式 第一行仅—个数据n(0<n<1000),表示产品的数量. 接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数). 最后的n个数据是表示这n个产品在B车

BUCT蓝桥杯热身赛II题解

A题 编码(decode) 签到题,没有可说的. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <set> 5 6 using namespace std; 7 8 int main () { 9 int mark[26]; 10 memset(mark,0,sizeof(mark)); 11 string child,goal;int N; 12 cin

贪心小总结

介绍几种贪心题型 1.选择不相交区间: 按照结束时间从大到小排序,如果区间左端点大于当前最右点就选,否则不选. 例题:活动安排: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<cmath> #include<queue> using namespace std; const int maxm=1100; int n,

《信奥一本通》提高版—简要题解

<信奥一本通>提高版-简要题解 贪心 活动安排: 按右端点排序,因为越早结束越好. 然后从1扫到n,每次比较当前位置线段的左端点是否大于上一个选的线段的右端点.如果大于,那么ans++,将上一个选的线段的右端点更新为当前线段的右端点:如果小于,那什么都不用做.因为选上一条一定比选当前这一条更优(结束时间更早). 种树 按右端点排序,对于每个区间的需求,从右端往左端扫,只要没种到树的就种,ans++. 因为要使前面的需求尽量与后面的需求重叠,从而使树的数量最少 喷水装置 观察+画图发现对于一个圆

规则引擎如何优化生产调度系统

生产调度系统是制造企业MES系统的重要组成部分,对应于生产管理系统的短期计划安排,主要目标是通过良好的作业加工排序,最大限度减少生产过程中的准备时间,优化某一项或几项生产目标,为生产计划的执行和控制提供指导.在不同的问题环境中,生产调度的优化目标也不同.在生产制造企业中影响生产调度的因素很多(比如设备.工人的生产技能等),这些因素样式复杂,种类繁多,灵活多变.另外在不同的环境下,影响生产调度的规则数量.优先级都会发生变化.过去生产调度系统将业务逻辑与主体代码紧耦合,业务规则以: 的形式被硬编码到

[ CodeVS冲杯之路 ] P2492

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,