1
1

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.

31歳の元保守運用エンジニアがAtCoder参加してみた 2回目

Posted at

はじめに

ABC333に参加したのでその振り返り。

A問

今回のA問は、単純かつ易しい内容。
回答内容は以下。

ソースコード
A.cpp
#include\<bits/stdc++.h>

using namespace std;

int main(void){
    int number_N;
    cin >> number_N;

    for(int i = 0; i < number_N; i++){
        cout << number_N;
    }

    cout << endl;
}

標準入力からNを受け取り、それをそのままN回分出力するだけ。
時間もかけずにAC(正解)。

しかしそうなると不安になるのがB問。
A問が簡単だとB問は難化するのが個人的な感覚。

B問

予想通り難しかった。1時間前後かけたが回答できず。
以下未完成だが回答。

ソースコード
B.cpp
#include\<bits/stdc++.h>

using namespace std;

int main(void){
    char S1, S2;
    char T1, T2;
    cin >> S1 >> S2;
    cin >> T1 >> T2;

    if(S1 == T1 && S2 == T2){
        cout << "Yes" << endl;
        return 0;
    }else if(S1 == T2 && S2 == T1){
        cout << "Yes" << endl;
        return 0;
    }

    vector<char> pentagon(5);
    pentagon = {'A', 'B', 'C', 'D', 'E'};

    int numberOfS1, numberOfS2, numberOfT1, numberOfT2;

    for (int i = 0; i < 5; ++i) {
        if (pentagon[i] == S1) {
            if(i == 3){
                numberOfS1 = 2;
            }else if(i == 4){
                numberOfS1 = 1;
            }else{
                numberOfS1 == i;
            }
        }
    }

    for (int i = 0; i < 5; ++i) {
        if (pentagon[i] == S2) {
            if(i == 3){
                numberOfS2 = 2;
            }else if(i == 4){
                numberOfS2 = 1;
            }else{
                numberOfS2 == i;
            }
        }
    }

    for (int i = 0; i < 5; ++i) {
        if (pentagon[i] == T1) {
            if(i == 3){
                numberOfT1 = 2;
            }else if(i == 4){
                numberOfT1 = 1;
            }else{
                numberOfT1 == i;
            }
        }
    }

    for (int i = 0; i < 5; ++i) {
        if (pentagon[i] == T1) {
            if(i == 3){
                numberOfT2 = 2;
            }else if(i == 4){
                numberOfT2 = 1;
            }else{
                numberOfT2 == i;
            }
        }
    }


    cout << endl;
}

考え方としては、A~Eの頂点を得点化し、Aは初期値として0点。B・Eは1点、C・Dは2点として、A点からの距離を調べるようにした。
それで得点が同じになるかどうかで調べようとしたが、うまくいかず。
理由としては
「そもそもA点が初期値という前提で解いている。他の点が初期値になると当然解けなくなる」

問題内の入力例を見ても、アルファベットが若い順から線分が決まるわけでない。DA・EAのような場合があるため、やはりこの考え方では解けない。
思考中、家事をしたりして頭を別のことに逸らしたりしつつ、解こうと努力してみたが結局明解なものには至らず。
今回もB問は諦めることにした。

解説を見て

線分を長短2種類に分けて、そのどちらかかを判定するだけというのは感心した。
こういう普遍的な条件を抽出する力がまだ足りていないなと実感。
また、以下解説内で得られた知見。

  • ラムダ関数というC++の機能があること
    簡易な計算をしたいとき、これで宣言してやってmain関数内で完結させてみるのも学習に良いかも。
  • char型の文字列は文字列同士で計算させることができること
    これを用いて、2つの文字列が何個分先か後かを調べることができる。

振り返り

ここ3回ほどのABC、やたらB問の難度が高い印象がある。
まだまだ過去問を解きなれていないというのが大きいとは思うが。
また、Qiitaを巡っていたら、以下参考になる記事を見つけた。

↑に記載されている 「やるとよかったこと」 を参考にして学習を進めてみる予定。
ちなみに次回のABC334は、家族とクリスマスを過ごしたので休んだ!

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?