結果
問題 |
No.10 +か×か
|
ユーザー |
![]() |
提出日時 | 2025-09-05 10:50:53 |
言語 | Crystal (1.14.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,660 bytes |
コンパイル時間 | 13,769 ms |
コンパイル使用メモリ | 311,428 KB |
実行使用メモリ | 7,720 KB |
最終ジャッジ日時 | 2025-09-05 10:51:08 |
合計ジャッジ時間 | 13,011 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 5 WA * 3 RE * 4 |
ソースコード
n = gets.not_nil!.to_i total = gets.not_nil!.to_i list = gets.not_nil!.split.map(&.to_i) # Precompute minmax_list minmax_list = Array({Int32, Int32}).new(list.size + 1) minmax_list << {1, 0} # Initial state list.each do |i| prev_min, prev_max = minmax_list[-1] new_min = [prev_min + i, prev_min * i].min new_max = [prev_max + i, prev_max * i].max minmax_list << {new_min, new_max} end # Memory for memoization memory = Hash({Int32, Int32}, String?).new calc = uninitialized (Int32, Int32) -> String? calc = ->(total_val : Int32, point : Int32) do pair = {total_val, point} if memory.has_key?(pair) return memory[pair] end if point == 0 if total_val == list[point] memory[pair] = "" else memory[pair] = nil end return memory[pair] end kaito_list = [] of String # Multiplication if list[point] != 0 && total_val % list[point] == 0 next_total = total_val // list[point] min_val, max_val = minmax_list[point] if next_total >= min_val && next_total <= max_val if (next_calc = calc.call(next_total, point - 1)) kaito_list << next_calc + "*" end end end # Addition next_total = total_val - list[point] min_val, max_val = minmax_list[point] if next_total >= min_val && next_total <= max_val if (next_calc = calc.call(next_total, point - 1)) kaito_list << next_calc + "+" end end if kaito_list.empty? memory[pair] = nil else # Find the solution with maximum length (or any other criteria) kaito = kaito_list.max_by(&.size) memory[pair] = kaito end memory[pair] end result = calc.call(total, n - 1) puts result || -1