USACO job
这道题就是模拟工厂产品的生产过程, 题意如下, 有一种产品需要分别经过机器A和机器B通过,现在给定需要加工的产品的数量和机器A机器B的数量,以及一个机器加工一件产品所需要的时间, 求出机器A 和机器B 工作的最小时间。 由于机器可以同时加工因此我们考虑一个产品, 定义delay[0][j]为机器A中第j太机器加工的用时, 那么对于一个产品可以放进任意一个机器中加工,为了使机器A的工作时间最短我们选取delay[0][j]+time[0][j]最小的来加工当前的零件, 另外使用cost[0][j]表示机器A加工第j个零件所需要的最短时间, 那么第第一个答案就是cost[0][N-1]注意cost[0]数组为递增的,同理我们可以处理处cost[1][j]数组。 对于第二个问题, 我们求出cost[0][j]+cost[N-1-j]的最大值即可。代码如下:
/* ID: m1500293 LANG: C++ PROG: job */ #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; int N, M[2]; int time[2][35]; //0为1机器 1为2机器 int delay[2][35]; int cost[2][1010]; int main() { freopen("job.in", "r", stdin); freopen("job.out", "w", stdout); scanf("%d%d%d", &N, &M[0], &M[1]); for(int i=0; i<M[0]; i++) scanf("%d", &time[0][i]); for(int j=0; j<M[1]; j++) scanf("%d", &time[1][j]); for(int f=0; f<=1; f++) { for(int i=0; i<N; i++) //现在要加工第i个工件 { int cho, tptm=0x3fffffff; for(int j=0; j<M[f]; j++) //选择用哪个机器加工第i个工件 { if(delay[f][j]+time[f][j] < tptm) { tptm = delay[f][j] + time[f][j]; cho = j; } } delay[f][cho] = delay[f][cho] + time[f][cho]; cost[f][i] = tptm; } } int res1 = cost[0][N-1]; int res2 = 0; for(int i=0; i<N; i++) { res2 = max(res2, cost[0][i]+cost[1][N-1-i]); } printf("%d %d\n", res1, res2); return 0; }