1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AtCoder Beginner Contest 337 振り返り

Posted at

ABC337

概要

A - Scoreboard

考えてたこと
特になし、全部足すだけ。

提出したもの

a.cpp
int main() {
    int n;
    cin >> n;
    int takahashi = 0;
    int aoki = 0;
    rep(i, 0, n) {
        int a, b;
        cin >> a >> b;
        takahashi += a;
        aoki += b;
    }
    if (takahashi > aoki) {
        cout << "Takahashi" << endl;
    } else if (takahashi < aoki) {
        cout << "Aoki" << endl;
    } else {
        cout << "Draw" << endl;
    }
    return 0;
}

振り返り
特になし。

B - Extended ABC

考えてたこと
先頭からABC順番に消して行って文字列が残ったらYes, Noとかにする...?って考えたけど、最近お仕事で使ったから正規表現使ってみることにしたらすごく簡単だった。

提出したもの

b.cpp
int main() {
    string s;
    cin >> s;

    if (regex_match(s, regex("A*B*C*"))) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}

振り返り
お仕事で偶然勉強したことがこういうところで活かせると少し嬉しくなります。

C - Count xxx

考えてたこと
全然解けなくて解説を見てもよくわからなかったのでyoutubeの公式解説動画まで見てやっと理解できました。
n番目の人がA[i]の後ろで...みたいに難しく考えて自分の首を絞めていました。
解説を見ながら真似して書いたのが以下。

提出したもの

c.cpp
int main() {
    int n;
    cin >> n;
    vector<int> vec(n);
    map<int, int> map;

    for (int i = 0; i < n; i++) {
        cin >> vec[i];
    }

    // map[a]=bの時、aの後ろにbが並んでいる
    for (int i = 0; i < n; i++) {
        map[vec[i]] = i + 1;
    }

    int start;
    for (int i = 0; i < n; i++) {
        if (vec[i] == -1) {
            start = i + 1;
        }
    }

    int cnt = 0;
    while (cnt < n) {
        cout << start << " ";
        start = map[start];
    }
    cout << start << endl;
}

振り返り
自分で解いてた時でもmap[a]=b(bの後ろにaがいる)、みたいな連想配列自体を作れていたのでなぜそれを逆にできなかったのか...。落ち着いたら解けたかも、反省です。

D - Cheating Gomoku Narabe

考えてたこと
これは実力不足で解けなかったかなぁと思いました。ただ累積和使う問題自体は以前も解いたことがあるので数をこなして慣れたいです。解説を見ながら書いたコードが以下。

提出したもの

d.cpp
int main() {
    int h, w, k;
    cin >> h >> w >> k;
    int x[200001], d[200001];
    char glid[h][w];
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            cin >> glid[i][j];
        }
    }

    int ans = 1e9;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            x[j + 1] = x[j];
            d[j + 1] = d[j];
            if (glid[i][j] == 'x')
                x[j + 1]++;
            if (glid[i][j] == '.')
                d[j + 1]++;
        }
        for (int i = 0; i < w - k + 1; i++) {
            if (x[i + k] - x[i] == 0) {
                ans = min(ans, d[i + k] - d[i]);
            }
        }
    }

    for (int i = 0; i < w; i++) {
        for (int j = 0; j < h; j++) {
            x[j + 1] = x[j];
            d[j + 1] = d[j];
            if (glid[j][i] == 'x')
                x[j + 1]++;
            if (glid[j][i] == '.')
                d[j + 1]++;
        }
        for (int i = 0; i < h - k + 1; i++) {
            if (x[i + k] - x[i] == 0) {
                ans = min(ans, d[i + k] - d[i]);
            }
        }
    }

    if (ans > k)
        ans = -1;
    cout << ans << endl;

    return 0;
}

振り返り
解説にある通り、いきなり全部考えるんじゃなくてまずは一行の時にどのように求めるか、みたいに落ち着いて課題を分解すれば良かったかもです、学び。

感想

C問題までは安定して解きたいって思ってるからまた解けなくてちょっとショック。
落ち着いて解くことと数をこなして問題自体に慣れていきたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?