「next if が超便利!」ABC175B

目次

問題

atcoder.jp

f:id:mt4proconkai:20200819235603j:plain

赤、青を1本目、2本目に選ぶと、三角形は3通りできますね、という具合のお話

(長さはフリーハンド、参考程度です)

回答

# 棒の本数を受け取る
n = gets.to_i
# 棒の長さを受け取って小さい順に並び替える
a = gets.split.map(&:to_i).sort
# 答えの変数を初期化する
ans = 0
# i番目の棒を1本目とする
(0...(n - 2)).each do |i|
# j番目の棒を2本目とする
*1.each do |j|
# 「2本目の棒が1本目の棒と同じ長さ」だったら次をあたる
next if a[i] == a[j]
((j + 1)...n).each do |k|
# 「三角形が作れない」か、「3本目の棒が2本目の棒と同じ長さ」だったら次をあたる
next if a[i] + a[j] <= a[k] || a[j] == a[k]
# 三角形が作れる選び方を見つけたので、答えに加える
ans += 1
end
end
end
puts ans

学んだ処理

docs.ruby-lang.org

感想 

全探索をするにしても、nextを使うと不要なループを続けなくていいので計算時間が短くなっていい感じです!

*1:i + 1)...(n - 1