ABC109
17位!!Ratedコンテストでこんな順位取りたい、、
D - Make Them Even
左上から順に見ていき奇数のマスがあったら右か下に追いやったとしても偶数の数は減らない(追いやる先が奇数か偶数かは関係ない)。
これよりかはかなり難しいですが、この問題を思い出しました。
こういう問題はすぐ貪欲だと気づきたいですよね。もっと簡単な例だとバブルソートの正当性証明とかと同じ類の問題ですね
#include <bits/stdc++.h> using namespace std; int h, w; int b[500][500]; struct a { int y1, x1, y2, x2; }; vector<a> ans; int main() { cin >> h >> w; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cin >> b[i][j]; } } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (b[i][j] % 2) { if (j != w - 1) { b[i][j] -= 1; b[i][j + 1] += 1; ans.push_back({i, j, i, j + 1}); continue; } if (i != h - 1) { b[i][j] -= 1; b[i + 1][j] += 1; ans.push_back({i, j, i + 1, j}); continue; } } } } cout << ans.size() << endl; for (auto a: ans) { cout << a.y1 + 1 << " " << a.x1 + 1 << " " << a.y2 + 1 << " " << a.x2 + 1 << endl; } }