torus711 のアレ

主に競技プログラミングの問題について書きます

Codeforces 159, B : Playing Cubes

概要

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