SRM602 div2 Med PilingRectsDiv2
問題読み間違えて詰んでた
問題概要
・幅Xi高さYiの長方形がN個ある
・面積がlimit以上となるように長方形を重ねる(はみ出して良い、はみ出したらいけないと思っていた)
・90度回転して良い
・最大で何枚重ねられるか
方針
まず幅>高さとなるようにし、幅で昇順に並び替える。重ねる長方形の最小の幅を固定し重ねた時にlimitを超えるかどうか調べる。超えるなら重ねる。
最小の幅がO(N)。それぞれの最小の幅について幅が最小の幅以上の長方形についてlimitを超えるかどうかの計算でO(N)。よって計算量はO(N2)。
コード
typedef pair<int, int> P; class PilingRectsDiv2 { public: int getmax(vector <int> X, vector <int> Y, int limit) { int n = X.size(); vector<P> v(n); FOR(i,0,n) { if(X[i] < Y[i]) swap(X[i], Y[i]); v[i] = P(X[i], Y[i]); } sort(v.begin(), v.end()); int ans = -1; FOR(i,0,n) { int cnt = 0; FOR(j,i,n) if(v[i].first * min(v[i].second, v[j].second) >= limit) cnt++; if(cnt) ans = max(ans, cnt); } return ans; } };
英語難しい