TopCoder SRM 639 Div1 Easy: AliceGame (貪欲法)

解法

残っている数から引くことの出来る最大の奇数を引く。これを繰り返す。ただし。残りの数字が2になるようなパターンは避ける。

コード

public class AliceGame {

	public long findMinimumValue(long x, long y) {
		long sum = x + y;
		long n = (long) Math.sqrt(sum);
		if (n * n != sum || x == 2 || y == 2) {
			return -1;
		}

		long ans = 0;

		// 数列の最大値
		long max = 2 * n - 1;
		while (x > 0 && max > 0) {
			// max以下かつx以下の最大の奇数を求める
			if (max > x) {
				max = x;
			}
			if (max % 2 == 0) {
				max--;
			}

			// 2になるとどうしようもないので除く
			if (x - max != 2) {
				x -= max;
				ans++;
			}
			max -= 2;
		}

		if (x == 0) {
			return ans;
		} else {
			return -1;
		}

	}
}