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】加工生产调度的更多相关文章

  1. codevs 3008 加工生产调度[贪心]

    3008 加工生产调度  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 某工厂收到了n个产品的订 ...

  2. 加工生产调度(prod)

    加工生产调度(prod) 题目描述 有n个部件需在A.B机器上加工,每个工件都必须经过先A后B两道工序. 已知:部件i在A.B机器上的加工时间分别为ai,bi. 问:如何安排n个工件的加工顺序,才能使 ...

  3. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  4. 洛谷P1248 加工生产调度

    流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...

  5. 【题解/模板】P1248 加工生产调度(贪心)

    [题解/模板]P1248 加工生产调度(贪心) 分析: \(A\)流水线的时间是确定的,所以现在就是要让\(b\)的时间尽量短 \(tB > tA\),除非所有东西都不需要\(b\).(t指结束 ...

  6. 「一本通 1.1 例 4」加工生产调度(贪心算法)(luogu P1248)题解

    加工生产调度 题目描述 某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i i i 在 A. ...

  7. 【洛谷P1248】加工生产调度

    题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序, ...

  8. Codevs3008 加工生产调度

    题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,而且必须先在A车间加工后才干够到B车间加工. 求如何安排这n个产品的加工顺序.才干使总的加工时间最短. 这里所说的加工时间是指 ...

  9. CODEVS——T3008 加工生产调度

    http://codevs.cn/problem/3008/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

随机推荐

  1. 今天遇到奇怪的事:SVN本地代码的标记突然没了,Clean up也报错

    今天遇到奇怪的事:SVN本地代码的标记突然没了.Clean up也报错 脑子一想这样的情况,能够先把原来的文件夹改一个名字.又一次把代码check out下来,再合并提交更新,但这样也太LOW了吧 上 ...

  2. 【iOS开发系列】颜色渐变

    记录: //Transparent Gradient Layer - (void) insertTransparentGradient { UIColor *colorOne = [UIColor c ...

  3. HTTP网络协议(一)

    1.了解Web及网络基础 TCP/IP协议族按层次可以分为下面四层: 应用层:决定了向用户提供应用服务时通信的活动,TCP/IP协议族内预存了各类通用的应用服务,比如:FTP(文件传输协议)和DNS( ...

  4. The behavior of App killed or restored by Android System or by users

    What's the behavior of App killed or restored by Android System or by users? First, user kills the a ...

  5. JAVA日志库2

    一.常用日志Jar关系 2015第30周四Java日志组件 接口:将所有日志实现适配到了一起,用统一的接口调用. 实现:目前主流的日志实现 旧日志到slf4j的适配器:如果使用了slf4j,但是只想用 ...

  6. Vmware P2V 清除被隱藏網卡佔用的的IP

    修改註冊表也可以讓非正常卸載的網卡釋放捆綁的固定的IP地址,註冊表中定位於中:HKEY_LOCAL_MACHINE \SYSTEM\ CurrentControlSet\Services\Tcpip\ ...

  7. WordPress的后台功能菜单介绍与操作,WordPress后台说明

    WordPress网站的后台概况和登陆地址 网站都有个后台管理系统,通过网站后台,你可以改变你的网站外观,管理你网站的数据,给网站前台增加页面,文章,视频,图片或者其他功能. 通过WordPress建 ...

  8. [Recompose] Render Nothing in Place of a Component using Recompose

    Learn how to use the ‘branch’ and ‘renderNothing’ higher-ordercomponents to render nothing when a ce ...

  9. 将HTML格式的String转化为HTMLElement 分类: C1_HTML/JS/JQUERY 2014-08-05 12:01 1217人阅读 评论(0) 收藏

    代码如下: <meta charset="UTF-8"> <title>Insert title here</title> </head& ...

  10. Android中的消息机制:Handler消息传递机制 分类: H1_ANDROID 2013-10-27 22:54 1755人阅读 评论(0) 收藏

    参考<疯狂android讲义>第2版3.5 P214 一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为 ...