結果
問題 |
No.332 数列をプレゼントに
|
ユーザー |
|
提出日時 | 2016-03-05 01:27:09 |
言語 | Ruby (3.4.1) |
結果 |
AC
|
実行時間 | 125 ms / 2,000 ms |
コード長 | 1,276 bytes |
コンパイル時間 | 191 ms |
コンパイル使用メモリ | 7,296 KB |
実行使用メモリ | 24,320 KB |
最終ジャッジ日時 | 2024-12-24 08:33:04 |
合計ジャッジ時間 | 6,754 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 42 |
コンパイルメッセージ
Syntax OK
ソースコード
N, X = gets.split.map(&:to_i) NS = gets.split.map(&:to_i) nis = NS.map.with_index{|n,idx| [n,idx]}.select{|ni| ni[0] <= X}.sort ans = catch(:ok) do #DPを使用し、作成できる和を求める。 #ただし、要素が10000以上になったところで計算をやめる。 #(全ての要素に対して行うと、計算が終わらないため) dp1 = {} dp1[0] = [] while ni = nis.shift do num, idx = ni add = {} dp1.each do |sum, idxs1| new_sum = sum + num throw :ok, idxs1.dup << idx if new_sum == X add[new_sum] = idxs1.dup << idx if new_sum < X && !dp1[new_sum] end dp1.update(add) break if dp1.size >= 10_000 end #上記で使用しなかった要素について、再度DPで作成できる和を求める。 #上記で求めた和のいずれかと合わせてXとなれば、解の発見となる。 dp2 = {} dp2[0] = [] while ni = nis.shift do num, idx = ni add = {} dp2.each do |sum, idxs2| new_sum = sum + num throw :ok, (dp1[X - new_sum] + idxs2) << idx if dp1[X - new_sum] add[new_sum] = idxs2.dup << idx if new_sum < X && !dp2[new_sum] end dp2.update(add) end nil end puts ans ? (0...N).map{|i| ans.include?(i) ? "o" : "x"}.join : "No"