没注意:their rating is 500 !!! 打脸。。
简单的暴力:
class PilingRectsDiv2 {
public:
int getmax(vector <int>, vector <int>, int);
};
int PilingRectsDiv2::getmax(vector <int> X, vector <int> Y, int limit) {
int ans = 0, i, j, k, Max;
for(i=1; i<=200; ++i)
for(j=1; j<=200; ++j){
if(i*j >= limit) {
Max = 0;
for(k=0; k<X.size(); ++k){
if( (X[k]>=i&&Y[k]>=j) || (X[k]>=j&&Y[k]>=i) )
Max++;
}
if(Max > ans ) ans = Max;
}
}
if(ans == 0) return -1;
else return ans;
}
还可以用记忆化搜索做(别人的代码):
int
solve (int idx, int l, int b) {
if (idx == N) {
if (l == LIM && b == LIM) return -1;
if (l * b >= lim) return 0;
if (l * b < lim) return -INF;
}
if (memo [idx][l][b] != -1) return memo [idx][l][b];
int ret = 0;
ret = 1 + max (solve (idx + 1, min (L [idx], l), min (B [idx], b)),
solve (idx + 1, min (B [idx], l), min (L [idx], b)));
ret = max (ret, solve (idx + 1, l, b));
return memo [idx][l][b] = ret;
}
class PilingRectsDiv2 {
public:
int
getmax(vector<int> X, vector<int> Y, int limit) {
L = X; B = Y;
memset (memo, -1, sizeof (memo));
LIM = 202;
lim = limit;
N = len (X);
return solve (0, LIM, LIM);
}
};
没看,不会做。
先留着,以后解决。
http://community.topcoder.com/stat?c=problem_solution&rd=15820&pm=12929&cr=23288241
http://community.topcoder.com/stat?c=problem_solution&rd=15820&pm=12929&cr=23282585
http://community.topcoder.com/stat?c=problem_solution&rd=15820&pm=12929&cr=23288971
http://community.topcoder.com/stat?c=problem_solution&rd=15820&pm=12929&cr=23137498