結果
問題 |
No.107 モンスター
|
ユーザー |
![]() |
提出日時 | 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()