結果
問題 | No.332 数列をプレゼントに |
ユーザー |
|
提出日時 | 2016-03-05 01:22:58 |
言語 | Ruby (3.4.1) |
結果 |
AC
|
実行時間 | 108 ms / 2,000 ms |
コード長 | 1,285 bytes |
コンパイル時間 | 103 ms |
コンパイル使用メモリ | 7,424 KB |
実行使用メモリ | 24,576 KB |
最終ジャッジ日時 | 2024-12-24 08:32:57 |
合計ジャッジ時間 | 5,802 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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}.sortans = catch(:ok) do#DPを使用し、作成できる和を求める。#ただし、要素が10000以上になったところで計算をやめる。#(全ての要素に対して行うと、計算が終わらないため)dp1 = {}dp1[0] = []while ni = nis.shift donum, idx = niadd = {}dp1.each do |sum, idxs1|new_sum = sum + numthrow :ok, idxs1.dup << idx if new_sum == Xadd[new_sum] = idxs1.dup << idx if new_sum < X && !dp1[new_sum]enddp1.update(add)break if dp1.size >= 10_000end#上記で使用しなかった要素について、再度DPで作成できる和を求める。#上記で求めた和のいずれかと合わせてXとなれば、解の発見となる。dp2 = {}dp2[0] = []while ni = nis.shift donum, idx = niadd = {}dp2.each do |sum, idxs2|new_sum = sum + numidxs1 = dp1[X - new_sum]throw :ok, (idxs1 + idxs2) << idx if idxs1add[new_sum] = idxs2.dup << idx if new_sum < X && !dp2[new_sum]enddp2.update(add)endnilendputs ans ? (0...N).map{|i| ans.include?(i) ? "o" : "x"}.join : "No"