voidsolve(){ int n, m, k; cin >> n >> m >> k; string s; cin >> s; int ans = 0, p = 0, len = 0; while (p < n) { if (s[p] == '0') { len++; if (len == m) { ans++; len = 0; p += k; continue; } } else { len = 0; } p++; } cout << ans << '\n'; }
memset(vis, false, sizeof vis); std::queue<PII> q; int n, m; cin >> n >> m; int cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; if (i == 0 && a[i][j] == 'U' || i == n - 1 && a[i][j] == 'D') { vis[i][j] = true; q.push({i, j}); cnt++; } elseif (j == 0 && a[i][j] == 'L' || j == m - 1 && a[i][j] == 'R') { vis[i][j] = true; q.push({i, j}); cnt++; } } } while (!q.empty()) { auto u = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int x = u.fi + dx[i], y = u.se + dy[i]; if (x < 0 || x >= n || y < 0 || y >= m || vis[x][y]) continue; if (a[x][y] == dir_obj[i]) { vis[x][y] = true; q.push({x, y}); cnt++; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!vis[i][j]) { bool flag = true; for (int k = 0; k < 4; k++) { int x = i + dx[k], y = j + dy[k]; if (x < 0 || x >= n || y < 0 || y >= m) continue; if (!vis[x][y]) { flag = false; break; } } if (flag) { cnt++; vis[i][j] = true; } } } } cout << m * n - cnt << '\n'; }
关键在于如何确定最大k次操作对于该方法是足够的,样例过了我们可以先交一发试试,发现过了,太棒了,由于该题k值给的很模糊,并且一个很有暗示性的Minimizing the number of moves is not required,我们无法确切的确定该方法的可行性,但我们的贪心思想每次将一对发生交换的数字分别移动到它们目前可行位置的边界处(最大值和最小值),过掉该题是非常有可能的。