結果
| 問題 | No.710 チーム戦 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-07 23:06:11 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,158 bytes |
| 記録 | |
| コンパイル時間 | 1,935 ms |
| コンパイル使用メモリ | 95,692 KB |
| 実行使用メモリ | 79,084 KB |
| 最終ジャッジ日時 | 2026-07-07 23:06:19 |
| 合計ジャッジ時間 | 3,426 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 4 WA * 21 |
ソースコード
'''
WAだがいったん提出。同じところの扱いとかダメそう。
DPの仕方を工夫すべき? ABC 204 Dみたいにすべき?
yukicoder No207
方針: ナップザックDP
dp[i][x] = 問題0,1,2,...,iまで解答して、最後に人xが解答したときに解答時間が最も短くなる時の、[雪男の解答時間, 雪女の解答時間]
*x = 雪男or雪女
入力例1:
3 最後に雪男が解答 最後に雪女が解答
45 50 -> [45,0] [0,50]
20 80 -> [20,50] *1 [45,80]*2
*1: [65,0]or[20,50]だと[20,50]のほうがよい
*2: [45,80]or[0,130]だと[0,130]のほうがよい
40 15 -> [60,50] [20,65]
メモ:
i問目まで解けた時点での最短で、i+1問目を解く際の最短を考えれる
最後に雪男(人0)/雪女(人1)が解いたかで状態を圧縮できる(通常は最大2^100通り)
'''
# 入力
N = int(input())
times = dict({0:[],1:[]}) # times[x][i] = 人xの問題iの解答時間
for i in range(N):
a,b = list(map(int, input().split()))
times[0].append(a)
times[1].append(b)
#print(times)
# DP
dp = [[[0,0],[0,0]] for _ in range(N+1)] # dp[i][x] = i問目を人xが解いて最短時間になるときの[人0の解答時間, 人1の解答時間]
NUM_PERSONS = 2
for i in range(N):
if(i == 0):
dp[i][0] = [times[0][i],0]
dp[i][1] = [0,times[1][i]]
else:
# 問題iを人0が解く
# (1)問題i-1:人0、問題i:人0 が解く
prev = 0
tmp_prev1 = dp[i-1][prev]
tmp_now1 = [tmp_prev1[0]+times[0][i], tmp_prev1[1]]
solve_time1 = max(tmp_now1)
sum_times1 = sum(tmp_now1)
# (2)問題i-1:人1、問題i:人0 が解く
prev = 1
tmp_prev2 = dp[i-1][prev]
tmp_now2 = [tmp_prev2[0]+times[0][i], tmp_prev2[1]]
solve_time2 = max(tmp_now2)
sum_time2 = sum(tmp_now2)
# 比較
if(solve_time1 < solve_time2):
dp[i][0] = tmp_now1[:] # コピーしたのを渡した方がよい? -> 変わらず
elif(solve_time1 == solve_time2): # ここはだいぶ怪しい(先々まで見て考えないとダメな気がする...? 最後に回答している人が同じだから合計が少ないほうでよい?)
dp[i][0] = tmp_now1[:] if(sum_time1 < sum_time2) else tmp_now2[:]
else:
dp[i][0] = tmp_now2[:]
# 問題iを人1が解く
# (3)問題i-1:人0、問題i:人1 が解く
prev = 0
tmp_prev1 = dp[i-1][prev]
tmp_now1 = [tmp_prev1[0], tmp_prev1[1]+times[1][i]]
solve_time1 = max(tmp_now1)
sum_time1 = sum(tmp_now1)
# (4)問題i-1:人1、問題i:人0 が解く
prev = 1
tmp_prev2 = dp[i-1][prev]
tmp_now2 = [tmp_prev2[0], tmp_prev2[1]+times[1][i]]
solve_time2 = max(tmp_now2)
sum_time2 = sum(tmp_now2)
# 比較
if(solve_time1 < solve_time2):
dp[i][1] = tmp_now1[:]
elif(solve_time1 == solve_time2):
dp[i][1] = tmp_now1[:] if(sum_time1 < sum_time2) else tmp_now2[:]
else:
dp[i][1] = tmp_now2[:]
#for tmp in dp:
# print(tmp)
# 最小値を求める
ans = float("inf")
for x in range(NUM_PERSONS):
solve_time = max(dp[N-1][x])
ans = min(solve_time, ans)
print(ans)