AtCoder Beginner Contest 281に参加しました&反省会
AtCoder Beginner Contest 281の振り返り
- A,B問題は解くことができ、C,D問題は解答方針だけ立てることができました
- B問題に時間を取られました
- コンテスト開始前にエディタの起動など必要な環境を準備しておく
B - Sandwich Number
考えたこと
- 入力サイズは8
- 入力値の1文字目と8文字目がA-Z
- 入力値の2文字目から7文字目は数値
- 入力値の2文字目は0を除く
だめだったこと
- for文で入力の各文字について受け取り一文字ずつ判定する最初の方針に固執した
- 数値になる文字列を切り抜いて文字列から数値にする転換できるかを調べようとした
- 都度条件を満たすかで真偽値を切り替えており、一度falseになっても後の条件でtrueになることで誤答になった→初期値をtrueに、条件を満たさない場合にfalseに設定する
実装例で覚えておきたいもの
- char型は文字コードに対応した英数字を格納する
'A' <= c and c <= 'Z' '0' <= c and c <= '9'
- 配列の先頭・末尾を取得する
std::string s; s.fornt(); s.back();
- Yes/Noの出力に三項演算子を利用する
bool flag; cout << (flag ? "Yes" : "No") << '\n';
- 存在しない配列の要素にアクセスする(今回だと要素数が8より小さい場合)
string s = "hello"; s.at(7); //例外が発生 s[7]; //例外は発生しない
C - Circular Playlist
考えたこと
- 楽曲のループについては、与えられた時間をプレイリストの総時間数で割ることで解決できる
- 上で導いた残り時間からプレイリストの楽曲の時間だけ引いていけば曲と時間を導けられそうだが →残り時間と楽曲を比較:超過した場合残り時間-楽曲で求められる
考慮漏れ
- 入力値がintの範囲を超える数値になるのでlong long型を使う
実装例から覚えておきたいもの
- 範囲を集計する関数:accumlate()
accumulate()は、範囲を集計する関数である。 初期値(init)に対して、範囲[first, last)の各要素iを前から順番に、任意の二項演算関数binary_opをinit = f(init, *i)のように適用していき、範囲の< 全ての要素を集計した結果を戻り値として返す。
const std::vector<int> v = {1, 2, 3, 4, 5}; // (1) : 合計値を求める int sum = std::accumulate(v.begin(), v.end(), 0); std::cout << "sum : " << sum << std::endl; //sum: 15