5月31日に開催されたAtCoder Beginner Contest 169。
ぱっと見簡単そうな問題だと思ったがACできなかったB問題を考える。
各問題の制約や入力・出力例はリンク先(AtCoderのサイト)へ。
B - Multiplication 2
問題文
N 個の整数 A1,...,AN が与えられます。
A1×...×AN を求めてください。
ただし、結果が 1018 を超える場合は、代わりに-1
を出力してください。 入力
入力は以下の形式で標準入力から与えられる。
N
A1 ... AN
提出したコード(不正解)
n = gets ary = gets.split.map(&:to_i) b = 1 ary.each do |a| b *= a end puts b > 10**18 ? -1 : b
結果:TLE(実行時間制限超過) 実行時間:2211 ms
これはTLEだろうな、と思いながらも他に思いつかなかった。
ACコード
正解者の方々のコードをいくつか見た後に自分なりに書いたコード。
n = gets ary = gets.split.map(&:to_i) b = 1 if ary.include?(0) puts 0 exit end ary.each do |a| b *= a if b > 10**18 puts -1 exit end end puts b
考えたことを言語化してみる
ary(A1 ... AN)に0
があればその時点で0
を出力して終了。
aryの要素を掛けていって b に代入。
b が 10**18 より大きくなったら -1
を出力して終了。
exit
が呼び出されずプログラムの最後までいったときはb
を出力。
感想
順番が大事だった。
これぐらいさらっと解けるようになりたい。
もっといい変数名をつけたい。