大意:
有N个工件,每个工件要经过两道工序A,B,有若干台机器分别可用于A,B工序(不重合),每台机器有各自的加工时间。问最少何时A工序全部完成,最少何时B工序全部完成。
分析与实现
只有两道工序,很简单。分别计算A,B机器完成N个工件需要的时间,A工序的即为所求。对B工序,为使得总的最大时间最小,应该把A先加工出来的工件给B中加工最久的,这样依次统计B的完成时间。
工件加工的一般情况没这么简单,工序增加,或工件在每台机器上的加工时间是不同的(形成一个加工时间矩阵),都会使问题变得复杂。
/*
ID: blackco3
TASK: job
LANG: C++
*/
#include <iostream>
using namespace std;
const int _n_mach_type_(2), _max_job_(1000), _max_mach_(30), _max_val_(0x7fffffff);
int n_job, n_mach[_n_mach_type_], tneed[_n_mach_type_][_max_mach_];
int free_time[_n_mach_type_][_max_mach_], finish_time[_n_mach_type_][_max_job_];
int main(){
freopen("job.in", "r", stdin);
freopen("job.out", "w", stdout);
cin >> n_job >> n_mach[0] >> n_mach[1] ;
for( int it=0; it<_n_mach_type_; it++ ) {
for( int im=0; im<n_mach[it]; im++)
cin >> tneed[it][im];
for(int ij=0; ij<n_job; ij++) {
register int min_finish = _max_val_, mach_asgn ;
for (int im=0; im<n_mach[it]; im++) {
if( min_finish <= free_time[it][im] + tneed[it][im] )
continue ;
min_finish = free_time[it][im] + tneed[it][im] , mach_asgn = im;
}
free_time[it][mach_asgn] = finish_time[it][ij] = min_finish ;
}
}
cout << finish_time[0][n_job-1] <<' ';
int max_finish = 0 ;
for( int ij=0; ij<n_job; ij++)
if( max_finish < finish_time[0][ij] + finish_time[1][n_job-ij-1] )
max_finish = finish_time[0][ij] + finish_time[1][n_job-ij-1] ;
cout << max_finish <<endl;
return 0;
}