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.
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:
|
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;
}