C++の練習を兼ねて, AtCoder Beginner Contest 090 の 問題C(Flip,Flip, and Flip……)を解いてみた.
最初, if文で, 1行×1列の場合, 2行×M列の場合, N行×2列の場合, … などと試行錯誤していたが, 絶対値を使ってみると,
全ての条件が, 一つの式で表せることが確認できたので, 見た目が, だいぶスリムになったと思う.
かなり感動したので, 投稿することになってしまった(汗).
本家のサイトABC 090/ARC 091 解説をご覧下さい。
■C++版プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 解き直し. // ABC 090 解説. // https://img.atcoder.jp/arc091/editorial.pdf #include <iostream> using namespace std; #define abs(x) ((x > 0) ? x : (-(x))) typedef long long LL; int main() { // 1. 入力情報取得. LL N, M; cin >> N >> M; // 2. カードの状態を把握. // 例えば, // (1, 1)成分 … (1, 1) -> (1, 2) -> (2, 1) -> (2, 2) の 4回操作されるので"表"のはず. // (1, 2)成分 … (1, 1) -> (1, 2) -> (1, 3) -> (2, 1) -> (2, 2) -> (2, 3) の6回操作されるので"表"のはず // -> 結局, カードの最終状態は, 自カードを含む周囲のカード枚数により, 偶数 … 表, 奇数 … 裏 と分類されることになる LL reversedCard = abs((N - 2) * (M - 2)); // いろんなパターンが, この数式に集約される. // 3. 出力 ~ 後処理. cout << reversedCard << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 090