C++——【USACO 4.2.3】——Job Processing

44 篇文章 0 订阅

Job Processing
IOI'96

A factory is running a production line that requires two operations to be performed on each job: first operation "A" then operation "B". Only a certain number of machines are capable of performing each operation.


Figure 1 shows the organization of the production line that works as follows. A type "A" machine takes a job from the input container, performs operation "A" and puts the job into the intermediate container. A type "B" machine takes a job from the intermediate container, performs operation "B" and puts the job into the output container. All machines can work in parallel and independently of each other, and the size of each container is unlimited. The machines have different performance characteristics, a given machine requires a given processing time for its operation.

Give the earliest time operation "A" can be completed for all N jobs provided that the jobs are available at time 0. Compute the minimal amount of time that is necessary to perform both operations (successively, of course) on all N jobs.

PROGRAM NAME: job

INPUT FORMAT

Line 1:Three space-separated integers:
  • N, the number of jobs (1<=N<=1000).
  • M1, the number of type "A" machines (1<=M1<=30)
  • M2, the number of type "B" machines (1<=M2<=30)
Line 2..etc:M1 integers that are the job processing times of each type "A" machine (1..20) followed by M2 integers, the job processing times of each type "B" machine (1..20).

SAMPLE INPUT (file job.in)

5 2 3
1 1 3 1 4

OUTPUT FORMAT

A single line containing two integers: the minimum time to perform all "A" tasks and the minimum time to perform all "B" tasks (which require "A" tasks, of course).

SAMPLE OUTPUT (file job.out)

3 5

工作处理
IOI 96
工厂正在运行一条生产线,需要在每个作业上执行两个操作:第一个操作“A”然后运行“B”。只有一定数量的机器能够执行每个操作。
图1显示了以下工作的生产线的组织。“A”机器从输入容器中获取作业,执行“A”操作,并将作业放入中间容器中。
“B”型机器从中间容器中获得工作,执行“B”操作,并将作业放入输出容器中。所有的机器都可以相互独立地工作,而且每个容器的大小都是无限的。机器具有不同的性能特点,一台给定的机器需要一个给定的处理时间来进行操作。

为所有N个工作输出“A”可以完成的最早时间,开始的工作时间为0。并计算执行所有N个工作所需要的最小时间量(当然是依次执行的)。

项目名称:job
输入格式
第一行:三个空格分隔的整数:
N,工作数(1 <=N<= 1000)。
M1,A的数量(1 <=M1<=30)
M2,B的数量(1 <=M2<=30)
line2. .等等:m1整数是每一种“A”机器(1 .. 20)的作业处理时间,其次是M2整数,每一种“B”机器的作业处理时间(1 . 20)。
示例输入文件 job.in
5 2 3
1 1 3 1 4
输出格式
包含两个整数的单行:执行所有“A”任务的最小时间,以及执行所有“B”任务的最小时间。
样例输出(文件job.out)
3 5

/*
ID : mcdonne1
LANG : C++
TASK : job
*/

#pragma GCC optimize("O3")

#include <cstdio>
#include <algorithm>

using namespace std;

int N, M1, M2, k;
int time1[31], time2[31], done1[31], done2[31], ans1[1001], ans2[1001];

int main () {
	freopen ("job.in", "r", stdin);
	freopen ("job.out", "w", stdout);
	scanf ("%d%d%d", &N, &M1, &M2);
	for (int i = 1; i <= M1; i++) scanf ("%d", &time1[i]);
	for (int i = 1; i <= M2; i++) scanf ("%d", &time2[i]);
	int cnt;
	for (int i = 1; i <= N; i++) {
		cnt = 1 << 30;
		for (int j = 1; j <= M1; j++)
			if(done1[j] + time1[j] < cnt) {
				cnt = done1[j] + time1[j];
				k = j;
			}	
		done1[k] = ans1[i] = cnt;
	}
	printf ("%d ", cnt);
	for (int i = 1; i <= N; i++) {
		cnt = 1 << 30;
		for (int j = 1; j <= M2; j++)
			if(done2[j] + time2[j] < cnt) {
				cnt = done2[j] + time2[j];
				k = j;
			}
		done2[k] = ans2[i] = cnt;
	}
	cnt = 0;
	for (int i = 1; i <= N; i++)
		cnt = max(cnt, ans1[i] + ans2[N-i+1]);
	printf ("%d\n", cnt);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值