C-merのブログ

ザ・雑記

三年目の初学者(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;
    }
};