結果

問題 No.1538 引きこもりさんは引き算が得意。
ユーザー tomerun
提出日時 2021-06-06 19:26:12
言語 Crystal
(1.14.0)
結果
AC  
実行時間 17 ms / 2,000 ms
コード長 1,745 bytes
コンパイル時間 15,082 ms
コンパイル使用メモリ 295,508 KB
実行使用メモリ 7,296 KB
最終ジャッジ日時 2024-12-14 05:34:02
合計ジャッジ時間 17,290 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 54
権限があれば一括ダウンロードができます

ソースコード

diff #

n, k32 = read_line.split.map(&.to_i)
k = k32.to_i64
a = read_line.split.map(&.to_i64)
solve(n, k, a)

def solve(n, k, a)
  if a.includes?(k)
    puts "Yes"
    exit
  end
  pre = a[0...(n // 2)]
  suf = a[(n // 2)..]
  po1, no1, mix1 = comb(pre)
  po2, no2, mix2 = comb(suf)
  if mix1.includes?(k) || mix2.includes?(k)
    puts "Yes"
    exit
  end
  po1.each do |s|
    if no2.includes?(k - s) || mix2.includes?(k - s)
      puts "Yes"
      exit
    end
  end
  no1.each do |s|
    if po2.includes?(k - s) || mix2.includes?(k - s)
      puts "Yes"
      exit
    end
  end
  mix1.each do |s|
    if po2.includes?(k - s) || no2.includes?(k - s) || mix2.includes?(k - s)
      puts "Yes"
      exit
    end
  end
  puts "No"
end

def comb(a)
  po = Set(Int64).new
  no = Set(Int64).new
  mix = Set(Int64).new
  a.size.times do |i|
    dfs_po(a, i + 1, a[i], po, no, mix)
    dfs_no(a, i + 1, -a[i], po, no, mix)
  end
  return po, no, mix
end

def dfs_po(a, i, sum, set_po, set_no, set_mix)
  if i == a.size
    set_po << sum
    return
  end
  dfs_po(a, i + 1, sum, set_po, set_no, set_mix)
  dfs_po(a, i + 1, sum + a[i], set_po, set_no, set_mix)
  dfs_mix(a, i + 1, sum - a[i], set_po, set_no, set_mix)
end

def dfs_no(a, i, sum, set_po, set_no, set_mix)
  if i == a.size
    set_no << sum
    return
  end
  dfs_no(a, i + 1, sum, set_po, set_no, set_mix)
  dfs_mix(a, i + 1, sum + a[i], set_po, set_no, set_mix)
  dfs_no(a, i + 1, sum - a[i], set_po, set_no, set_mix)
end

def dfs_mix(a, i, sum, set_po, set_no, set_mix)
  if i == a.size
    set_mix << sum
    return
  end
  dfs_mix(a, i + 1, sum, set_po, set_no, set_mix)
  dfs_mix(a, i + 1, sum + a[i], set_po, set_no, set_mix)
  dfs_mix(a, i + 1, sum - a[i], set_po, set_no, set_mix)
end
0