結果
| 問題 |
No.107 モンスター
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:45:14 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 97 ms / 5,000 ms |
| コード長 | 2,302 bytes |
| コンパイル時間 | 257 ms |
| コンパイル使用メモリ | 82,636 KB |
| 実行使用メモリ | 78,204 KB |
| 最終ジャッジ日時 | 2025-03-31 17:46:06 |
| 合計ジャッジ時間 | 2,640 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx += 1
D = list(map(int, input[idx:idx + N]))
bad = []
good = []
for d in D:
if d < 0:
bad.append(-d)
else:
good.append(d)
B = len(bad)
G = len(good)
# DP table: mask_bad is for defeated bad monsters, mask_good for used good monsters
dp = [[-1 for _ in range(1 << G)] for _ in range(1 << B)]
dp[0][0] = 100 # initial state
for mask_bad in range(1 << B):
for mask_good in range(1 << G):
current_hp = dp[mask_bad][mask_good]
if current_hp <= 0:
continue
# Current number of defeated bad monsters
k = bin(mask_bad).count('1')
max_hp_current = 100 * (k + 1)
# Action A: use a good monster
for i in range(G):
if not (mask_good & (1 << i)):
heal = good[i]
new_hp = min(current_hp + heal, max_hp_current)
new_mask_good = mask_good | (1 << i)
if new_hp > dp[mask_bad][new_mask_good]:
dp[mask_bad][new_mask_good] = new_hp
# Action B: defeat a bad monster
for j in range(B):
if not (mask_bad & (1 << j)):
damage = bad[j]
new_hp = current_hp - damage
if new_hp > 0:
new_mask_bad = mask_bad | (1 << j)
if new_hp > dp[new_mask_bad][mask_good]:
dp[new_mask_bad][mask_good] = new_hp
max_final = 0
full_bad = (1 << B) - 1
max_hp_final = 100 * (B + 1)
for mask_good in range(1 << G):
current_hp = dp[full_bad][mask_good]
if current_hp <= 0:
continue
# Calculate remaining good monsters
remaining_heal = sum(good[i] for i in range(G) if not (mask_good & (1 << i)))
final_hp = current_hp + remaining_heal
final_hp = min(final_hp, max_hp_final)
if final_hp > max_final:
max_final = final_hp
print(max_final if max_final > 0 else 0)
if __name__ == '__main__':
main()
lam6er