結果
| 問題 |
No.107 モンスター
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-07-17 12:50:04 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 123 ms / 5,000 ms |
| コード長 | 1,822 bytes |
| コンパイル時間 | 86 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 15,488 KB |
| 最終ジャッジ日時 | 2024-12-18 01:43:57 |
| 合計ジャッジ時間 | 1,978 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
def read_data():
N = int(input())
Ds = list(map(int, input().split()))
return N, Ds
def solve(N, Ds):
global memo, best_score, upper
memo = [dict() for i in range(1 << N)]
best_score = -1
remain = (1 << N) - 1
level = 100
power = 100
good = [d for d in Ds if d > 0]
bad = [d for d in Ds if d < 0]
good.sort()
bad.sort(reverse=True)
upper = upper_limit(level, power, remain, Ds)
return dfs(level, power, remain, bad + good)
def upper_limit(level, power, remain, Ds):
Dds = [d for i, d in enumerate(Ds) if remain & (1 << i)]
n_bad = len([1 for d in Dds if d < 0])
return min(power + sum(Dds), level + 100 * n_bad), n_bad
def dfs(level, power, remain, Ds):
global memo, best_score, upper
if power in memo[remain]:
return memo[remain][power]
if remain == 0:
return power
if best_score == upper:
return best_score
limit, n_bad = upper_limit(level, power, remain, Ds)
if limit <= best_score:
return 0
if n_bad == 0:
memo[remain][power] = limit
return limit
record = 0
for i, d in enumerate(Ds):
idx = 1 << i
if not (remain & idx) or power + d <= 0:
continue
if d > 0:
if level == power:
continue
new_power = min(level, power + d)
result = dfs(level, new_power, remain - idx, Ds)
if result > record:
record = result
elif d < 0:
result = dfs(level + 100, power + d, remain - idx, Ds)
if result > record:
record = result
memo[remain][power] = record
if record > best_score:
best_score = record
return record
if __name__ == '__main__':
N, Ds = read_data()
print(solve(N, Ds))