AtCoder Beginner Contest 109 参加ログ

結果

 10分ちょっと遅れてスタートし、24分ほどかけて全完。Dでアホみたいな2WA出してペナルティ食らったのは反省。

A - ABC333

 脳みそを使いたくなかったので愚直にやった。コード

#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

int main() {
    ll A, B;
    cin >> A >> B;
    for (ll C = 1; C <= 3; C++) {
        if (A * B * C % 2 == 1) {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
}

B - Shiritori

 std::mapで2回以上出るかを数えて、あとは前のものの最後と今回の先頭文字が一致しているかを確認。コード

#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

int main() {
    ll N;
    cin >> N;
    vector<string> W(N);
    for (ll i = 0; i < N; i++) {
        cin >> W[i];
    }

    map<string, ll> mp;
    for (ll i = 0; i < N; i++) {
        if (++mp[W[i]] == 2) {
            cout << "No" << endl;
            return 0;
        }
        if (i > 0 && W[i - 1].back() != W[i].front()) {
            cout << "No" << endl;
            return 0;
        }
    }

    cout << "Yes" << endl;
}

C - Skip

 x_1, \dots, x_NXを一つの配列に詰めてソートして、階差の最大公約数を取っていったものが答え。厳密には証明してないけど、まぁこれでしょという感じで解いた。コード

#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

ll gcd(ll a, ll b) {
    return (b ? gcd(b, a % b) : a);
}

int main() {
    ll N, X;
    cin >> N >> X;
    vector<ll> x(N);
    for (ll i = 0; i < N; i++) {
        cin >> x[i];
    }
    x.push_back(X);
    sort(x.begin(), x.end());

    ll ans;
    for (ll i = 0; i < N; i++) {
        ll diff = x[i + 1] - x[i];
        if (i == 0) {
            ans = diff;
        } else {
            ans = gcd(ans, diff);
        }
    }

    cout << ans << endl;
}

D - Make Them Even

 各列について左から右へ見ていき、奇数だったら右に一個流す。最後に各行の一番右を見ていき、奇数だったら下に一個流す。間違えてa[i][j] % 2 == 0とか書いていたのと、最初に操作回数を表示することを忘れていて2回WA。コード

#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

int main() {
    ll H, W;
    cin >> H >> W;

    vector<vector<ll>> a(H, vector<ll>(W));
    for (ll i = 0; i < H; i++) {
        for (ll j = 0; j < W; j++) {
            cin >> a[i][j];
        }
    }

    vector<ll> y, x, yy, xx;
    for (ll i = 0; i < H; i++) {
        for (ll j = 0; j < W - 1; j++) {
            if (a[i][j] % 2 == 1) {
                //右へ
                y.push_back(i + 1);
                x.push_back(j + 1);
                yy.push_back(i + 1);
                xx.push_back(j + 2);
                a[i][j]--;
                a[i][j + 1]++;
            }
        }
    }
    for (ll i = 0; i < H - 1; i++) {
        if (a[i][W - 1] % 2 == 1) {
            //下へ
            y.push_back(i + 1);
            x.push_back(W);
            yy.push_back(i + 2);
            xx.push_back(W);
            a[i][W - 1]--;
            a[i + 1][W - 1]++;
        }
    }

    cout << y.size() << endl;
    for (ll i = 0; i < y.size(); i++) {
        cout << y[i] << " " << x[i] << " " << yy[i] << " " << xx[i] << endl;
    }
}