結果
| 問題 | No.332 数列をプレゼントに |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-02-29 13:30:51 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 775 ms / 2,000 ms |
| コード長 | 1,395 bytes |
| コンパイル時間 | 112 ms |
| コンパイル使用メモリ | 12,544 KB |
| 実行使用メモリ | 182,400 KB |
| 最終ジャッジ日時 | 2024-12-24 08:35:46 |
| 合計ジャッジ時間 | 26,163 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 42 |
ソースコード
def read_data():
N, X = map(int, input().split())
As = list(map(int, input().split()))
return N, X, As
def solve(N, X, As):
Bs = [(a, i) for i, a in enumerate(As)]
Bs.sort()
As.sort()
n_large = min(N, 20)
n_small = N - n_large
len_dp = sum(As[:n_small]) + 1
dp_small = fill_dp(n_small, len_dp, Bs[:n_small])
lst_large = brute_force(n_large, Bs[n_small:])
for val, bits in lst_large:
dif = X - val
if dif == 0:
return decode(bits, N)
elif 0 < dif < len_dp and dp_small[dif]:
return decode(bits + dp_small[dif], N)
return "No"
def decode(bits, N):
result = []
for i in range(N):
if bits & 1:
result.append('o')
else:
result.append('x')
bits >>= 1
return ''.join(result)
def fill_dp(n, length, Bs):
dp = [0] * length
for val, idx in Bs:
bit = 1 << idx
for i in range(length - 1 - val, 0, -1):
if dp[i]:
dp[i + val] = dp[i] | bit
dp[val] = bit
return dp
def brute_force(n, Bs):
lst = [(0, 0)] * (1 << n)
length = 1
for val, idx in Bs:
bit = 1 << idx
for i in range(length):
v, mask = lst[i]
lst[i + length] = (v + val, mask | bit)
length <<= 1
return lst
N, X, As = read_data()
print(solve(N, X, As))