【戯言】付け焼き刃の知識でabc241に出たが…c++で表現するのが難しい

徒然草2.0

C++を速習。atcoderのabc241に参加…頭の中で解けてもC++で書けない。

あと課題を解析する力が皆無。

abc241_aの問題…1行で取り込まれた値を配列形式で取り込む方法が分からずゴリゴリ書いた。

phpならscanfで取り込んでexplodeすればいいがc++の場合はどうやるのか???よくわからず。

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;
    int p = 0;
    vector<int> vec(10, 0);

    // 入力値を受け取る
    cin >> a0 >> a1 >> a2 >> a3 >> a4 >> a5 >> a6 >> a7 >> a8 >> a9;
    vec.at(0) = a0;
    vec.at(1) = a1;
    vec.at(2) = a2;
    vec.at(3) = a3;
    vec.at(4) = a4;
    vec.at(5) = a5;
    vec.at(6) = a6;
    vec.at(7) = a7;
    vec.at(8) = a8;
    vec.at(9) = a9;

    p = vec.at(0);
    p = vec.at(p);
    p = vec.at(p);

    cout << p << endl;
}

今、冷静に考えると個数分のcinを実行すればいいだけだった…という事がわかった。cinは処理系にもよるのかもしれないが、スペースや改行コード区切りで変数格納するstdのメソッドという位置づけなのだろうと推測する。だから別に行で取得する時もスペース区切りの値で取得する時も使えるようだ。これは便利かもしれない。無駄がない。

ループさせて入力値を受け取り、取得された数を要素数に3回さがす。

変数宣言、入力値取得、結果出力と同時に処理、の3行でやろうと思えばできるのか、、、

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> vec(10, 0);
    for(int i = 0; i < 10; i++) cin >> vec.at(i);
    cout << vec.at(vec.at(vec.at(0))) << endl;
}

デバッグしずらいためやってはいけないらしいが…atメソッドを[]で置き換えて記述量を減らす。

phpだと[]の中に配列をいれると展開してくれないがC++は意図したとおりに動いてくれている。パーサが優秀なのか?

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v(10, 0);
    for(int i = 0; i < 10; i++) cin >> v[i];
    cout << v[v[v[0]]] << endl;
}

abc241_bの問題も頭の中で解けたがc++での表現方法に苦労しそうだったので諦めた。

・C++もっと短く書けるように
・atcoderの問題をさっと読解できるように
…というのが喫緊の課題ということがとりあえず明確になったので、
ひとまず1週間に10時間ぐらいは勉強して忘れないようにしようと思う。

…というわけで、Ratingが79から80に+1された(苦笑)

徒然草2.0
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

タイトルとURLをコピーしました