USACO Training Section 4.2 Job Processing

英文原题 中文题译

 

大意:

有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;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值