pstopia Notes for Problem Solving Contest

[Easy] DropCoins

Topcoder SRM 525 Div1

Problem

적당히 조작을 하고 난 후, 남은 코인은 어떤 코인들일까? 원래 주어진 판에서 특정 직사각형 영역안에 있는 코인들일 것이다. 그래서 모든 직사각형 영역을 O((nm)^2) 으로 잡아보고 그 안에 있는 동전의 개수가 정확히 K개 되면, 그 영역안에 있는 동전들만 남도록 하는 최소의 조작횟수를 구해 답을 갱신해주면 된다.
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class DropCoins {
public:
int getMinimum(vector<string> board, int K) {
int n = board.size(), m = board[0].length();
vector<vector<int>> sum(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + (board[i - 1][j - 1] == 'o' ? 1 : 0);
}
}
int ans = 100000000;
for (int i = 1; i <= n; ++i) {
for (int k = i; k <= n; ++k) {
for (int j = 1; j <= m; ++j) {
for (int l = j; l <= m; ++l) {
int cnt = sum[k][l] - sum[i - 1][l] - sum[k][j - 1] + sum[i - 1][j - 1];
if (cnt == K) {
int val = 0;
val += min(i - 1, n - k) + (n - (k - i) - 1);
val += min(j - 1, m - l) + (m - (l - j) - 1);
ans = min(ans, val);
}
}
}
}
}
return ans >= 100000000 ? -1 : ans;
}
};
view raw DropCoins.cpp hosted with ❤ by GitHub