🧮

[ARC061 A] たくさんの数式

2024/03/21に公開

https://atcoder.jp/contests/arc061/tasks/arc061_a

bit全探索で解く問題。

問題を理解する

  • 数字の間に + を挟んでもよい
  • その数式の計算結果の合計を表示する

なので 12 だと 121+2 なので 12 + 3 = 15 になる。

普通に実装 (AC)

S = gets.strip.chars    # => ["1", "2", "5"]
total = ["+", ""].repeated_permutation(S.size.pred).sum do |e|
  expr = S.zip(e).join  # => "1+2+5", "1+25", "12+5", "125"
  eval(expr)            # => 8, 26, 17, 125
end
p total                 # => 176

特に難しいところはないが想定解とは違うようだ。

bit全探索な実装 (AC)

S = gets.strip.chars  # => ["1", "2", "5"]
N = S.size.pred       # => 2
total = (1 << N).times.sum do |i|
  expr = [S.first]
  N.times do |j|
    expr << (i.anybits?(1 << j) ? "+" : "")
    expr << S[j.next]
  end
  expr = expr.join    # => "125", "1+25", "12+5", "1+2+5"
  eval(expr)          # => 125, 26, 17, 8
end
p total               # => 176

二進数の模様を利用して多重ループを一次元のループに置き換える。こちらが想定解と思われる。

類題

https://zenn.dev/megeton/articles/08effdacac2b4c

Discussion