SRM488 Div2 Hard(1000) TheBoringGameDivTwo
試合の進み方が9通りあって、それぞれの回数をx1〜x9とすると、
x1(0,0,0,+1,0,+1)+x2(0,+1,0,0,0,+1)+x3(-1,+1,0,+1,+1,0)+x4(0,+1,-1,+1,+1,0)+x5(+1,0,0,0,0,+1)+x6(0,0,+1,0,0,+1)+x7(0,+1,+1,0,+1,+1)+x8(+1,0,0,+1,+1,+1)+x9(0,+1,0,+1,+2,0)=(scoreJ,killedJ,scoreB,killedB,scoreF,killedF)
x1,x2,x3,x4,x5,x6,x7,x8,x9≧0。
いくつかの変数の値を決めて他の変数の値を求める。
#include <vector> using namespace std; class TheBoringGameDivTwo{public: vector <int> find( int scoreJ, int killedJ, int scoreB, int killedB, int scoreF, int killedF ) { int minX = 99999999; int maxX = -1; for ( int x3=0; x3<=killedJ; x3++ ) for ( int x4=0; x3+x4<=killedJ; x4++ ) for ( int x5=0; x5<=killedF; x5++ ) for ( int x6=0; x5+x6<=killedF; x6++ ) { int x8 = scoreJ + x3 - x5; int x7 = scoreB + x4 - x6; int x9_2 = scoreF - x3 - x4 - x7 - x8; int x2 = killedJ - x3 - x4 - x7 - x9_2/2; int x1 = killedB - x3 - x4 - x8 - x9_2/2; if ( x9_2 % 2 == 0 && x1 + x2 + x5 + x6 + x7 + x8 == killedF && x1 >= 0 && x2 >= 0 && x7 >= 0 && x8 >= 0 && x9_2 >= 0 ) { int X = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9_2/2; minX = min( minX, X ); maxX = max( maxX, X ); } } vector<int> ans; if ( minX <= maxX ) ans.push_back( minX ), ans.push_back( maxX ); return ans; }};