結果
| 問題 |
No.2855 Move on Grid
|
| コンテスト | |
| ユーザー |
eve__fuyuki
|
| 提出日時 | 2024-08-25 20:09:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 135 ms / 3,000 ms |
| コード長 | 1,296 bytes |
| コンパイル時間 | 2,139 ms |
| コンパイル使用メモリ | 208,412 KB |
| 最終ジャッジ日時 | 2025-02-24 02:11:54 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
void fast_io() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
}
int main() {
fast_io();
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> a(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
auto is_valid = [&](int x, int y) {
return 0 <= x && x < n && 0 <= y && y < m;
};
int ok = 1, ng = 1e9 + 1;
while (ok + 1 < ng) {
int mid = (ok + ng) / 2;
vector<vector<int>> dp(n, vector<int>(m, 1e9));
vector<vector<bool>> vis(n, vector<bool>(m));
dp[0][0] = a[0][0] < mid;
deque<pair<int, int>> dq;
dq.push_back({0, 0});
while (!dq.empty()) {
auto [x, y] = dq.front();
dq.pop_front();
if (vis[x][y]) {
continue;
}
vis[x][y] = true;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (!is_valid(nx, ny)) {
continue;
}
int cost = (a[nx][ny] < mid);
if (dp[nx][ny] > dp[x][y] + cost) {
dp[nx][ny] = dp[x][y] + cost;
if (cost == 0) {
dq.push_front({nx, ny});
} else {
dq.push_back({nx, ny});
}
}
}
}
if (dp[n - 1][m - 1] <= k) {
ok = mid;
} else {
ng = mid;
}
}
cout << ok << endl;
}
eve__fuyuki