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
关于求A的最短时间,最先想到的是DP,而总时间的最小值该怎么求一直没有好的思路,感觉这个问题和4.1的fence rail 有些相似,最后只好搜索加剪枝,前6个点能过,第7个点超时,后来听ZZY说这个可以用贪心,再上网看了些解题报告,终于豁然开朗。在此推荐一个解释得比较清晰的博客:http://magicalcode.blogbus.com/logs/37193487.html
下面是我的代码:
#include<cstdio>
#include<algorithm>
#define oo 1000000
using namespace std;
FILE *in,*out;
int n,a,b,ta[30],tb[30],cost[30],tableA[10001],tableB[10001];
void greedy(int *arr,int len,int *rec);
bool cmp(const int &a,const int & b);
int main()
{
in=fopen("job.in","r");
out=fopen("job.out","w");
fscanf(in,"%d%d%d",&n,&a,&b);
for(int i=0;i<a;i++) fscanf(in,"%d",&ta[i]);
for(int i=0;i<b;i++) fscanf(in,"%d",&tb[i]);
greedy(ta,a,tableA);
greedy(tb,b,tableB);
int max=0;
sort(tableA,tableA+n);
fprintf(out,"%d ",tableA[n-1]);
sort(tableB,tableB+n,cmp);
for(int i=0;i<n;i++) if(max<(tableA[i]+tableB[i])) max=tableA[i]+tableB[i];
fprintf(out,"%d\n",max);
fclose(in);
fclose(out);
return 0;
}
void greedy(int *arr,int len,int *rec)
{
for(int i=0;i<len;i++) cost[i]=0;
for(int i=0;i<n;i++)
{
int min=oo;
int index;
for(int j=0;j<len;j++)
{
if(min>cost[j]+arr[j])
{
min=cost[j]+arr[j];
index=j;
}
}
cost[index]=min;
rec[i]=min;
}
}
bool cmp(const int &a,const int & b)
{
return a>b;
}