B - 視程の通報 | AtCoder Beginner Contest 001

less than 1 minute read

B - 視程の通報 | AtCoder Beginner Contest 001

解法

指示通りに条件分岐するだけだが入力は条件はで指定されていることに注意.
境界が含むかどうかに注意.

コーナーケース検討

指定された範囲ではなど想定されていない範囲があるが,問題文にその範囲の入力はないとある.
除算があるが,VVが整数値になる入力しかないとあるのでこちらも気にしないでいい.

実装

指定された範囲はそれぞれ排反なのでelse文を有効活用する.
コーナーケース検討時に考えたことを踏まえ以下のように実装するととなる下限の部分はelseで賄われているのでわざわざなどと条件を記述しなくて良い.
仮にそうするならば最後のelse文をelse ifとしないと(回答としては問題がないが)途中で抜け落ちた が最後のelse文に含まれてしまい気持ち悪い.
出力に関してはVVが1桁かどうか判定して先頭に’0’を足してもいいが,出力フォーマットを指定できるStream manipulatorsがc++のiostreamには用意されているのでそれを用いた.

if (m < 100) ans = 0;
else if (m <= 5000) ans = m * 10 / 1000;
else if (m <= 30000) ans = m / 1000 + 50;
else if (m <= 70000) ans = (m - 30000) / 5000 + 80;
else ans = 89;
cout << setfill('0') << setw(2) << right << ans << endl;

Submission

データ構造・アルゴリズム