一 原题
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
二 分析
给定N个零件,M台机器,可以贪心(根据机器i结束当前加工的时间t[i]加上生产一个零件的时间s[i])求出每个零件加工完成的时间T[i]。如果有两道工序A,B,只需要将工序A里最慢的交给工序B里最快的即可,即答案等于max{Ta[i] + Tb[n-1-i]}。
三 代码
运行结果:
USER: Qi Shen [maxkibb3] TASK: job LANG: C++ Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 4188 KB] Test 2: TEST OK [0.000 secs, 4188 KB] Test 3: TEST OK [0.000 secs, 4188 KB] Test 4: TEST OK [0.000 secs, 4188 KB] Test 5: TEST OK [0.000 secs, 4188 KB] Test 6: TEST OK [0.000 secs, 4188 KB] Test 7: TEST OK [0.000 secs, 4188 KB] Test 8: TEST OK [0.000 secs, 4188 KB] Test 9: TEST OK [0.000 secs, 4188 KB] Test 10: TEST OK [0.000 secs, 4188 KB] Test 11: TEST OK [0.000 secs, 4188 KB] Test 12: TEST OK [0.000 secs, 4188 KB] All tests OK.
Your program ('job') produced all correct answers! This is your submission #6 for this problem. Congratulations!
AC代码:
/*
ID:maxkibb3
LANG:C++
PROB:job
*/
#include<cstdio>
const int MAXN = 1005;
const int MAXM = 35;
const int INF = 0x7fffffff;
int n, m[2];
int a[2][MAXM];
int t[2][MAXM];
int s[2][MAXN];
int max(int n1, int n2) {
return (n1 > n2) ? n1 : n2;
}
void init() {
scanf("%d%d%d", &n, &m[0], &m[1]);
for(int i = 0; i < m[0]; i++) scanf("%d", &a[0][i]);
for(int i = 0; i < m[1]; i++) scanf("%d", &a[1][i]);
}
void f(int idx) {
for(int i = 0; i < n; i++) {
int min_val = INF, min_idx;
for(int j = 0; j < m[idx]; j++) {
if(t[idx][j] + a[idx][j] < min_val) {
min_val = t[idx][j] + a[idx][j];
min_idx = j;
}
}
s[idx][i] = t[idx][min_idx] = min_val;
}
}
void solve() {
f(0);
f(1);
int max_val = 0;
for(int i = 0; i < n; i++) {
if(s[0][i] > max_val) max_val = s[0][i];
}
printf("%d ", max_val);
max_val = 0;
for(int i = 0; i < n; i++) {
if(s[0][i] + s[1][n - 1 -i] > max_val) max_val = s[0][i] + s[1][n - 1- i];
}
printf("%d\n", max_val);
}
int main() {
freopen("job.in", "r", stdin);
freopen("job.out", "w", stdout);
init();
solve();
return 0;
}