torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

TopCoder SRM 602, Division 2, Level 1 : TypoCoderDiv2

概要

 あるコンテストでは、レーティング 1200 以上を brown coder 、1200 未満を ciel coder と呼ぶ。新規参加者のレートは 500 である。
 ねこの Lower はこのコンテストに新規参加し、それからいくつかのコンテストに参加した。i 番目のコンテストの終了後のレートは rating[ i ] である。Lower の色( brown or ciel )が何回変わったか求めよ。

解法

 有効な i について、rating[ i ] と rating[ i + 1 ] に対応する色が違っている場所の数が答えです。rating の先頭に初期レートである 500 を挿入しておくと一度に処理できます。

コード

#define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i )

class TypoCoderDiv2
{
public:
	int count( vector <int> rating )
	{
		rating.insert( rating.begin(), 500 );
		
		const int N = rating.size();
		int res = 0;
		REP( i, 0, N - 1 )
		{
			res += color( rating[i] ) ^ color( rating[ i + 1 ] );
		}
		return res;
	}

	bool color( const int r )
	{
		return 1200 <= r;
	}
};