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

 

posted @ 2016-01-26 22:25  xing-xing  阅读(159)  评论(0编辑  收藏  举报