C-merのブログ

ザ・雑記

三年目の初学者(6問目)

問題
topcoder SRM 602 div2 med PilingRectsDiv2
TopCoder Statistics - Problem Statement

使用言語
C++

方針
・各長方形を重ねるかどうかで場合分け
・limitを下回らないように毎回チェック

所感
・もう英語できるとは言いません。ごめんなさい。
・圧倒的再帰&&条件分け
再帰の条件自体はそこまで難しくない?
・関数の引数を減らす方法がないか探っている(以前外部変数使ってやろうとしたけどだめだった)(誰か教えてください)
・条件演算子極めたい(条件演算子って入れ子にできる?←というか ? : で伸ばせるじゃん)
・何もないところに重ねるのって、無限の大きさの長方形に重ねるのと一緒だよね(哲学)

コード

//重なっている長方形の辺をx,y
//各i枚目について調べる
int pile(vector<int> X, vector<int> Y, int i, long x, long y, int size, int limit)
{
  //全部見終わったら終了
  if (i == size) return 0;

  if (x <= X[i] && y <= Y[i]) {
    return x * y >= limit ? pile(X, Y, i+1, x, y, size, limit)+1 : 0;
  } else if (x >= X[i] && y <= Y[i]) {
    if (x * y >= limit) {
      if (X[i] * y >= limit)
        return max(pile(X, Y, i+1, x, y, size, limit),
          pile(X, Y, i+1, X[i], y, size, limit)+1);
      else return pile(X, Y, i+1, x, y, size, limit);
    } else return 0;
  } else if (x <= X[i] && y >= Y[i]) {
    if (x * y >= limit) {
      if (x * Y[i] >= limit)
        return max(pile(X, Y, i+1, x, y, size, limit),
          pile(X, Y, i+1, x, Y[i], size, limit)+1);
      else return pile(X, Y, i+1, x, y, size, limit);
    } else return 0;
  } else {
      if (x * y >= limit) {
        if (X[i] * Y[i] >= limit)
          return max(pile(X, Y, i+1, x, y, size, limit),
            pile(X, Y, i+1, X[i], Y[i], size, limit)+1);
        else return pile(X, Y, i+1, x, y, size, limit);
      } else return 0;
  }
}