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