PKU 1017 Packets

Packets

1x1と2x2の隙間をカウントしながら大きい順に置いていく。

#include <iostream>

using namespace std;

int main()
{
    while ( true )
    {
        int p[7];
        for ( int i=1; i<=6; i++ )
            cin >> p[i];

        int num = 0;
        int s1 = 0;
        int s2 = 0;

        //  6
        num += p[6];
        //  5
        num += p[5];
        s1 += p[5] * 11;
        //  4
        num += p[4];
        s2 += p[4] * 5;
        //  3
        num += ( p[3] + 3 ) / 4;
        switch ( p[3] % 4 )
        {
            case 0:  s1 += 0, s2 += 0;  break;
            case 1:  s1 += 7, s2 += 5;  break;
            case 2:  s1 += 6, s2 += 3;  break;
            case 3:  s1 += 5, s2 += 1;  break;
        }
        //  2
        if ( s2 < p[2] )
            p[2] -= s2;
        else
            s1 += ( s2 - p[2] ) * 4,
            p[2] = 0;
        num += ( p[2] + 8 ) / 9;
        s1 += ( 9 - p[2]%9 ) % 9 * 4;
        //  1
        p[1] -= min( s1, p[1] );
        num += ( p[1] + 35 ) / 36;

        if ( num == 0 )
            break;

        cout << num << endl;
    }

    return 0;
}