1273 装配线调度2

 
描述

某汽车工厂有2个装配线,每个装配线有n 个装配站(按顺序编号1~n ),两个装配线对应的装配站执行相同的功能,但所用的时间可能不同。经过第i条流水线(i=1,2)的第j 个装配站所花的时间为Aij。从第i条流水线的第j 个装配站移到第j+1个装配站的时间可以忽略,而移到另外一个流水线的下一个装配站则需要一定的时间Tij。

汽车进入流水线不需要花时间,出流水线时需要花时间Tin。

汽车的装配需要按顺序经过所有装配站。

现在已知装配时间Aij 和转移时间Tij,要求输出装配一辆汽车所需要的最短时间。

注意:根据练习15.1-4 压缩存储空间的指示精神,本题做了较为严格的内存限制(其实还可以更严)。。。

输入

第一行为一个整数T,表示有T 组测试数据。

对于每组测试数据的第一行一个整数n (n <= 100,000),表示有n 个装配站。接下来的n 行按顺序给出了n 个装配站信息,其中第 j 行有4个整数A1j ,A2j ,T1j ,T2j。

输出

对于每组测试数据,输出两行:第一行一个整数即最短时间。第二行从n 到1 倒序输出经过的装配站所在的流水线的编号。(数据保证最优方案只有一种)

样例输入
1
6
7 8 2 2
9 5 3 1
3 6 1 2
4 4 3 2
8 5 4 1
4 7 3 2
样例输出
35
1 2 2 1 2 2

 

 

算法导论上经典例子,动态规划思想

#include <stdio.h>

int main()
{
    int t, n, i, res;
    int buffer[4], temp[2], data[4], ans[2][1000000];

//    freopen( "ans.txt", "r", stdin );

    scanf( "%d", &t );
    while( t-- )
    {
        scanf( "%d", &n );
        scanf( "%d%d%d%d", &buffer[0], &buffer[1], &buffer[2], &buffer[3] );
        for( i = 0; i < n - 1; i++ )
        {
            scanf( "%d%d%d%d", &data[0], &data[1], &data[2], &data[3] );
            temp[0] = buffer[0] + data[0];
            ans[0][i] = 1;
            if( buffer[1] + buffer[3] + data[0] < temp[0] )
            {
                temp[0] = buffer[1] + buffer[3] + data[0];
                ans[0][i] = 2;
            }
            temp[1] = buffer[1] + data[1];
            ans[1][i] = 2;
            if( buffer[0] + buffer[2] + data[1] < temp[1] )
            {
                temp[1] = buffer[0] + buffer[2] + data[1];
                ans[1][i] = 1;
            }
            buffer[0] = temp[0];
            buffer[1] = temp[1];
            buffer[2] = data[2];
            buffer[3] = data[3];
        }
        if( buffer[0] + buffer[2] < buffer[1] + buffer[3] )
        {
            res = 0;
        }
        else
        {
            res = 1;
        }
        printf( "%d\n", buffer[res] + buffer[res + 2] );
        printf( "%d ", res + 1 );
        for( i = n - 2; i >= 0; i-- )
        {
            printf( "%d ", ans[res][i] );
            res = ans[res][i] - 1;
        }
        putchar( '\n' );
    }
    return 0;
}


 

你可能感兴趣的:(1273 装配线调度2)