🐕

Atcoder Beginner Contest 380参加記

2024/11/17に公開

こんにちは。Anreqitです。
はじめまして、なので軽く自己紹介から始めます。
16歳(2024年現在)。高校一年生
灰色コーダー。
2024年10月19日のABC376から競技プログラミングを始めてちょうど一ヶ月たった、初心者ですが自分の成長を見るという意味でも参加記をつけることにしました。

ABC380の感想等を書きたいと思います。(言語はC++です。)
ちなみに3完でした。
https://atcoder.jp/contests/abc380

A-123233

int main() {
    int n; cin >> n; 
    int cnt1 = 0;
    int cnt2 = 0;
    int cnt3 = 0;
    string strN = to_string(n);

    for (int i = 0; i < 6; i++) {
        if (strN[i] == '1') cnt1++;
        else if (strN[i] == '2') cnt2++;
        else if (strN[i] == '3') cnt3++;
    }

    if ((cnt1 == 1) && (cnt2 == 2) && (cnt3 == 3)) 
        cout << "Yes" << endl;
    else 
        cout << "No" << endl;

}

律儀です。このとき、

string strN = to_string(n);

を書いていなかったことで、数値と文字列をごっちゃにしてしまって、怒られてしまいました。

そして、あとから他の問題などを解いていて学んだのですが、
整数の各位について処理するとき、whileをつかう方法があることを知りました。
テンプレートのように使おうと思います。

int findSumOfDigits(int n) {
  int sum = 0;
  while (n > 0) {
	sum += n % 10;
	n /= 10;
  }
  return sum;
}

B-Hurdle Parsing

int main() {
    string s; cin>>s;
    int n = s.length();
    int cnt = 0;
    for (int i=1; i<n; i++) {
        if (s[i] != '|'){
            cnt++;
        } else if (s[i] == '|') {
            cout << cnt << " ";
            cnt = 0;
        }
    }
    cout << endl;
}

一発でACできました。
公式解説とは違うコーディングですが、まぁ悪くないと思っています。

C-Move Segment

int main() {
    int n, k;
    string s;
    cin >> n >> k >> s;

    vector<int> start, end;
    bool br = false;
    for (int i=0; i<n; i++) {
        if (s[i] == '1' && !br) {
            start.push_back(i);
            br = true;
        } else if (s[i] == '0' && br) {
            end.push_back(i - 1);
            br = false;
        }
    }
    if (br)  end.push_back(n- 1);

    int kStart = start[k- 1];
    int kEnd = end[k- 1];

    string ns = s.substr(0, end[k - 2] + 1) + s.substr(kStart, kEnd - kStart + 1) + s.substr(end[k-2] + 1, kStart - end[k - 2] - 1) + s.substr(kEnd + 1);

    cout << ns << endl;

    return 0;
}

K番目の1の塊とその直前の0を入れ替えたものが答えとなります。
公式解説ではPythonが使われていて、C++の解答がないのでいろいろな方のブログなどを見てみましたが、まぁ当たり前な話皆さんいろいろな解答をしていました。

D-Strange Mirroring

頑張ったら解けそうだな、、、と思いつつ、昼にJOIの一次予選があり、バグらせまくって体力がなかった当時の僕に考える体力はありませんでした。(言い訳)
100乗ほど操作を行っているから、全探索出ないことだけはわかりましたが、何度か実験をしてみましたが、うまいこと判定する方法が思いつきませんでした。

解説です。
操作としては、Sから初めて、「全体の大文字と小文字をすべて変転させた文字列を結合させる」ということを行っています。この操作をk回繰り返すと全体は2^kブロックになります。ここまではおーけー、
ただ、この後公式解説を見てみるとなんだか2進数がでてきて、なんだかよくわからなくなったので理解を諦めました。また、賢くなったときに気が向いたら見直します。

最後に

まぁ、取れるところは取ったかな、、?って感じです。
もともとこれまでのABCコンテストでは生成AIの使用が認められていて、わからない問題や、実装を手こずったものの手助けに使用したりしていたのですが、今回のABC380から規則が変更されて、ChatGPTを含む生成AIの使用が禁止されたのでかなり、沼にハマったときに抜け出せなくなっていました。
バグの原因を探るというのも大切な力だと思うので、このまま勉強を続けたいと思います。

Discussion