三年目の初学者(11問目)
問題
Topcoder Single Round Match 620 Round 1 - Division I, Level One
TopCoder Statistics - Problem Statement
使用言語
C++
方針
・大きいところから、一個ずつ値を減らしていく。
(X, Y) -> (X-Y, Y) (X >= Y の時)
・一致したら終了(これ以下の値の数字の組も題意を満たすかもしれないが、x+yの最大値を求める問題なので、これで十分)
所感
・0になった時の処理が少し面倒くさいです。
・文字通りの逆転の発想。
コード
class PairGame { public: int maxSum(int a, int b, int c, int d) { while (a != c || b != d) { if ((a == 0 || b == 0) && (c == 0 || d == 0)) break; int maxab, maxcd; if (a == 0 || b == 0) maxab = 0; else maxab = max(a, b); if (c == 0 || d == 0) maxcd = 0; else maxcd = max(c, d); if (maxab >= maxcd) { if (a >= b) a -= b; else b -= a; } else { if (c >= d) c -= d; else d -= c; } } return a == c && b == d ? a + b : -1; } };