torus711 のアレ

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

TopCoder SRM 588, Division 2, level 1 : KeyDungeonDiv2

概要

N 個の扉があるダンジョンを探検している。
ダンジョンには赤、緑、白の三種類の鍵がある。
それぞれの扉には赤い鍵穴と緑の鍵穴がそれぞれ 0 個以上付いていて、赤い鍵は赤い鍵穴に、緑の鍵は緑の鍵穴にのみ挿さる。
白い鍵はどちらの鍵穴にも指すことができる。
また、鍵は再利用可能である。
それぞれの鍵の所持数が与えられるので、開けることのできる扉の数を求めよ。

解法

全ての扉について、開けることができるかどうかを調べることで解くことができます。

コード

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

class KeyDungeonDiv2
{
public:
	int countDoors( vector <int> doorR, vector <int> doorG, vector <int> keys )
	{
		const int N = doorR.size();

		int res = 0;
		REP( i, 0, N )
		{
			res += max( 0, doorR[i] - keys[0] ) + max( 0, doorG[i] - keys[1] ) <= keys[2];
		}
		return res;
	}
};