概要
n 個の赤いキューブと、m 個の青いキューブを使って二人でゲームをする。
各プレイヤーは先攻・後攻に別れる。
各ターンでは、プレイヤーは残っているキューブを一つ選び、一直線上に(左から右へ)並べていく。
これをキューブが無くなるまで続ける。(直線上には n + m 個のキューブが並ぶ)
先攻のポイントは、隣合うキューブ同士が同じ色となっている数で、後攻の得点は隣合うキューブ同士が異なる色となっている数である。
互いが最善を尽くした場合の、各プレイヤーの得点を答えよ。
解法
実際に生成されるキューブの並びを適当な表現で生成し、隣会う要素の比較をすると解けます。
コード
#define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i ) int main() { cin.tie( 0 ); ios::sync_with_stdio( false ); int n, m; cin >> n >> m; if ( n > m ) { swap( n, m ); } string str; REP( i, 0, n ) { if ( ( i + n ) % 2 ) { str += "ab"; } else { str += "ba"; } } str += string( m - n, 'b' ); int a = 0, b = 0; REP( i, 0, str.size() - 1 ) { if ( str[i] == str[ i + 1 ] ) { a++; } else { b++; } } cout << a << ' ' << b << endl; return 0; }