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
题目: http://ace.delos.com/usacoprob2?a=6usYpMytQ3l&S=job
题意:给你n个任务,每个任务要用ab两个步骤完成,有m1台机器做a步骤,m2台机器做b步骤,求完成a步骤的时间,和完成b步骤的时间
分析:这题显然是任务调度问题,对于第一问,也就是完成a步骤,对于第二问,一开始我以为是网络流问题,因为这道题放在这个地方= =,其实还是个贪心问题,我们只要假设没有a步骤,然后同a步骤的做法,求出每个任务完成的具体时间,ab两个时间时间表反向相加的最大值就是第二问
代码:
/*
ID: 15114582
PROG: job
LANG: C++
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[33],b[33],s1[33],s2[33],aa[1111],bb[1111];
int main()
{
freopen("job.in","r",stdin);
freopen("job.out","w",stdout);
int i,j,k,n,m1,m2,t;
while(~scanf("%d%d%d",&n,&m1,&m2))
{
for(i=0;i<m1;++i)
scanf("%d",&a[i]),s1[i]=0;;
for(i=0;i<m2;++i)
scanf("%d",&b[i]),s2[i]=0;
for(t=0;t<n;++t)
{
k=1e9;
for(i=0;i<m1;++i)
if(s1[i]+a[i]<k)
{
k=s1[i]+a[i];
j=i;
}
aa[t]=s1[j]=k;
k=1e9;
for(i=0;i<m2;++i)
if(s2[i]+b[i]<k)
{
k=s2[i]+b[i];
j=i;
}
bb[t]=s2[j]=k;
}
sort(aa,aa+n);
sort(bb,bb+n);
printf("%d ",aa[n-1]);
for(k=i=0;i<n;++i)
k=max(k,aa[i]+bb[n-i-1]);
printf("%d\n",k);
}
return 0;
}