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