結果
| 問題 | No.3417 Tired Santa |
| コンテスト | |
| ユーザー |
hibit_at
|
| 提出日時 | 2025-12-18 18:51:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 210 ms / 2,000 ms |
| コード長 | 2,010 bytes |
| 記録 | |
| コンパイル時間 | 218 ms |
| コンパイル使用メモリ | 82,900 KB |
| 実行使用メモリ | 120,584 KB |
| 最終ジャッジ日時 | 2025-12-23 23:30:46 |
| 合計ジャッジ時間 | 3,610 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
def solve():
N, S = map(int, input().split())
X = list(map(int, input().split()))
W = list(map(int, input().split()))
# Sより左と右に分ける
left = [] # Sに近い順(xが大きい順)
right = [] # Sに近い順(xが小さい順)
for i in range(N):
if X[i] < S:
left.append((X[i], W[i]))
else:
right.append((X[i], W[i]))
left.sort(reverse=True) # Sに近い順
right.sort() # Sに近い順
L, R = len(left), len(right)
total_weight = sum(W)
# 累積和(配達済み重量の計算用)
left_sum = [0] * (L + 1)
for i in range(L):
left_sum[i + 1] = left_sum[i] + left[i][1]
right_sum = [0] * (R + 1)
for j in range(R):
right_sum[j + 1] = right_sum[j] + right[j][1]
INF = float('inf')
dp = [[[INF] * 2 for _ in range(R + 1)] for _ in range(L + 1)]
dp[0][0][0] = dp[0][0][1] = 0
for i in range(L + 1):
for j in range(R + 1):
for d in range(2):
if dp[i][j][d] == INF:
continue
# 現在位置
if i == 0 and j == 0:
cur_pos = S
elif d == 0:
cur_pos = left[i - 1][0]
else:
cur_pos = right[j - 1][0]
# 残り重量
remaining = total_weight - left_sum[i] - right_sum[j]
# 左に進む
if i < L:
dist = abs(cur_pos - left[i][0])
dp[i + 1][j][0] = min(dp[i + 1][j][0], dp[i][j][d] + dist * remaining)
# 右に進む
if j < R:
dist = abs(cur_pos - right[j][0])
dp[i][j + 1][1] = min(dp[i][j + 1][1], dp[i][j][d] + dist * remaining)
print(min(dp[L][R][0], dp[L][R][1]))
solve()
hibit_at