kmjp's blog

競技プログラミング参加記です

TopCoder SRM 564 Div2 Medium AlternateColors

続いてDiv2 Medium。Div1 Mediumと近い問題。
http://community.topcoder.com/stat?c=problem_statement&pm=12343

===

赤緑青のボールの個数が与えられ、赤緑青の順で1個ずつボールを減らしていったとき、K個目のボールの色を答える。

  • Kが最少のボールの3倍より小さいなら、K%3で決まる
  • それより大きい場合、残されたKが残りの2色の小さい方の数より小さいなら、K%2で決まる
  • それよりKが大きいなら、最多の色になる
class AlternateColors {
	public:
	string getColor(long long r, long long g, long long b, long long k) {
		
		long long m=min(min(r,g),b);
		
		if(k<=3*m) {
			if(k%3==1) return string("RED");
			if(k%3==2) return string("GREEN");
			if(k%3==0) return string("BLUE");
		}
		k-=3*m;
		r-=m;
		g-=m;
		b-=m;
		
		if(b==0) {
			if(k<=2*min(r,g)) return string((k%2)?"RED":"GREEN");
			return string((r>=g)?"RED":"GREEN");
		}
		if(g==0) {
			if(k<=2*min(r,b)) return string((k%2)?"RED":"BLUE");
			return string((r>=b)?"RED":"BLUE");
		}
		if(r==0) {
			if(k<=2*min(g,b)) return string((k%2)?"GREEN":"BLUE");
			return string((g>=b)?"GREEN":"BLUE");
		}
	}

まとめ

Div1と合わせてシンプルながら面白い問題。