1 条题解

  • 1
    @ 2026-8-27 10:17:50
    #include <queue>
    using namespace std;
    
    int N;
    int grid[500][500];
    bool visited[500][500];
    int dx[] = {0, 0, 1, -1};
    int dy[] = {1, -1, 0, 0};
    int target;
    
    int bfs(int sx, int sy, int D) {
        queue<pair<int,int>> q;
        q.push({sx, sy});
        visited[sx][sy] = true;
        int cnt = 1;
        while (!q.empty()) {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            for (int d = 0; d < 4; d++) {
                int nx = x + dx[d];
                int ny = y + dy[d];
                if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
                if (visited[nx][ny]) continue;
                int diff = grid[x][y] - grid[nx][ny];
                if (diff < 0) diff = -diff;
                if (diff > D) continue;
                visited[nx][ny] = true;
                cnt++;
                q.push({nx, ny});
            }
        }
        return cnt;
    }
    
    bool check(int D) {
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                visited[i][j] = false;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (!visited[i][j]) {
                    if (bfs(i, j, D) >= target) return true;
                }
            }
        }
        return false;
    }
    
    int main() {
        cin >> N;
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                cin >> grid[i][j];
    
        target = (N * N + 1) / 2;
    
        int lo = 0, hi = 1000000;
        while (lo < hi) {
            int mid = (lo + hi) / 2;
            if (check(mid)) {
                hi = mid;
            } else {
                lo = mid + 1;
            }
        }
    
        cout << lo << endl;
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    2126
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    3
    上传者