公式

B - Humidifier 2 解説 by MtSaka


加湿器が置かれたマスが\((i_1,j_1),(i_2,j_2)\) と定まっているとき、ある床のマス \((i,j)\)\(|i-i_1|+|j-j_1|\leq D\) または \(|i-i_2|+|j-j_2| \leq D\) を満たす時にのみ加湿され、容易に加湿されるかの判定ができます。

よって、加湿器を置くマスを全探索し、それぞれの置き方について全てのマスについて加湿されるか判定することで加湿される床のマスの個数を求めて、それらの最大値を計算することで答えを得られます。

加湿器の置き方は最大で \((HW)^2\) 通りあり、それぞれの置き方で \(HW\) 個の全てのマスについて加湿判定をするため、全体で \(\mathrm{O}((HW)^3)\) の計算量となります。

実装の際は加湿器を置くマスは床であること、求める値は加湿される床のマスの個数であることに注意する必要があります。

実装例(C++):

#include <bits/stdc++.h>
using namespace std;

int main() {
    int h, w, d;
    cin >> h >> w >> d;
    vector<string> s(h);
    for (int i = 0; i < h; ++i) {
        cin >> s[i];
    }
    int ans = 0;
    for (int i1 = 0; i1 < h; ++i1) {
        for (int j1 = 0; j1 < w; ++j1) {
            if (s[i1][j1] == '#')
                continue; //床のマスではない
            for (int i2 = 0; i2 < h; ++i2) {
                for (int j2 = 0; j2 < w; ++j2) {
                    if (s[i2][j2] == '#' || (i1 == i2 && j1 == j2))
                        continue; //床のマスではないか片方の加湿器と同じ場所
                    int tmp = 0;
                    for (int i = 0; i < h; ++i) {
                        for (int j = 0; j < w; ++j) {
                            if (s[i][j] == '.' && (abs(i - i1) + abs(j - j1) <= d || abs(i - i2) + abs(j - j2) <= d)) {
                                tmp++; //加湿されている
                            }
                        }
                    }
                    ans = max(ans, tmp);
                }
            }
        }
    }
    cout << ans << endl;
}

投稿日時:
最終更新: