結果
問題 | No.974 最後の日までに |
ユーザー |
![]() |
提出日時 | 2025-03-31 17:42:18 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 5,718 bytes |
コンパイル時間 | 301 ms |
コンパイル使用メモリ | 82,428 KB |
実行使用メモリ | 137,588 KB |
最終ジャッジ日時 | 2025-03-31 17:43:28 |
合計ジャッジ時間 | 6,966 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | TLE * 1 -- * 48 |
ソースコード
def main():import bisectW = int(input())weeks = [tuple(map(int, input().split())) for _ in range(W)]# Initialize DP. dp[i] is a dictionary with keys 0 and 1.dp = [{} for _ in range(W + 1)]dp[0][0] = [(0, 0)]for i in range(1, W + 1):current_a, current_b, current_c = weeks[i - 1]current_dp = {}for s_prev in (0, 1):if s_prev not in dp[i - 1]:continuefor m_prev, g_prev in dp[i - 1][s_prev]:if s_prev == 1:# Only possible action is datenew_m = m_prev - current_cnew_g = g_prev + current_bnew_s = 0if new_s not in current_dp:current_dp[new_s] = []updated = []for m, g in current_dp[new_s]:if not (m <= new_m and g <= new_g):updated.append((m, g))dominated = Falsefor m, g in updated:if m >= new_m and g >= new_g:dominated = Truebreakif not dominated:# Remove entries dominated by new entrytemp = []for m, g in updated:if not (m <= new_m and g <= new_g):temp.append((m, g))temp.append((new_m, new_g))temp.sort()current_dp[new_s] = tempelse:current_dp[new_s] = updatedelse:# s_prev is 0; three possible actions# Action 1: Schoolnew_s_school = 1 if i < W else 0new_m_school = m_prevnew_g_school = g_prevkey = new_s_schoolif key not in current_dp:current_dp[key] = []updated = []for m, g in current_dp[key]:if not (m <= new_m_school and g <= new_g_school):updated.append((m, g))dominated = Falsefor m, g in updated:if m >= new_m_school and g >= new_g_school:dominated = Truebreakif not dominated:temp = []for m, g in updated:if not (m <= new_m_school and g <= new_g_school):temp.append((m, g))temp.append((new_m_school, new_g_school))temp.sort()current_dp[key] = tempelse:current_dp[key] = updated# Action 2: Arubaitonew_m_arubaito = m_prev + current_anew_g_arubaito = g_prevnew_s_arubaito = 0key = new_s_arubaitoif key not in current_dp:current_dp[key] = []updated = []for m, g in current_dp[key]:if not (m <= new_m_arubaito and g <= new_g_arubaito):updated.append((m, g))dominated = Falsefor m, g in updated:if m >= new_m_arubaito and g >= new_g_arubaito:dominated = Truebreakif not dominated:temp = []for m, g in updated:if not (m <= new_m_arubaito and g <= new_g_arubaito):temp.append((m, g))temp.append((new_m_arubaito, new_g_arubaito))temp.sort()current_dp[key] = tempelse:current_dp[key] = updated# Action 3: Datenew_m_date = m_prevnew_g_date = g_prevnew_s_date = 0key = new_s_dateif key not in current_dp:current_dp[key] = []updated = []for m, g in current_dp[key]:if not (m <= new_m_date and g <= new_g_date):updated.append((m, g))dominated = Falsefor m, g in updated:if m >= new_m_date and g >= new_g_date:dominated = Truebreakif not dominated:temp = []for m, g in updated:if not (m <= new_m_date and g <= new_g_date):temp.append((m, g))temp.append((new_m_date, new_g_date))temp.sort()current_dp[key] = tempelse:current_dp[key] = updateddp[i] = current_dpmax_g = -1for s_final in (0, 1):if s_final not in dp[W]:continuefor m, g in dp[W][s_final]:if m >= 0 and g > max_g:max_g = gprint(max_g if max_g != -1 else 0)if __name__ == "__main__":main()