(備忘録)問題解決のための「アルゴリズム数学」〜 5

問題

atcoder.jp

自分の回答

これだと1つ1つのペアをeachするのでTLEになってしまいます。

gets
cnt = 0
gets.split.map(&:to_i).combination(2).each do |i|
  if i.inject(:+) == 100000
    cnt += 1
  end
end
puts cnt

他の回答

gets

# tally要素の数を数え上げた結果をHashで返す
A = gets.split.map(&:to_i).tally

ans = 0


A.each do |key, value|

# 50000を2枚選んだ時だけ異なる
  if key == 50000
    ans += value * (value - 1) / 2
  elsif A[100000 - key]
    ans += A[key] * A[100000 - key]
    A.delete(100000 - key)
  end
end

puts ans