結果

問題 No.2955 Pizza Delivery Plan
ユーザー noriocnorioc
提出日時 2024-11-09 02:59:04
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,043 ms / 2,000 ms
コード長 1,979 bytes
コンパイル時間 368 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 153,200 KB
最終ジャッジ日時 2024-11-09 02:59:27
合計ジャッジ時間 20,017 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 54 ms
55,552 KB
testcase_01 AC 52 ms
55,552 KB
testcase_02 AC 61 ms
63,232 KB
testcase_03 AC 72 ms
66,944 KB
testcase_04 AC 80 ms
70,528 KB
testcase_05 AC 55 ms
56,192 KB
testcase_06 AC 58 ms
63,360 KB
testcase_07 AC 49 ms
55,936 KB
testcase_08 AC 291 ms
103,240 KB
testcase_09 AC 287 ms
103,164 KB
testcase_10 AC 470 ms
108,872 KB
testcase_11 AC 598 ms
112,816 KB
testcase_12 AC 667 ms
117,492 KB
testcase_13 AC 769 ms
122,364 KB
testcase_14 AC 801 ms
126,744 KB
testcase_15 AC 867 ms
130,952 KB
testcase_16 AC 913 ms
134,628 KB
testcase_17 AC 906 ms
138,080 KB
testcase_18 AC 993 ms
142,256 KB
testcase_19 AC 1,004 ms
144,540 KB
testcase_20 AC 978 ms
148,080 KB
testcase_21 AC 924 ms
150,304 KB
testcase_22 AC 1,002 ms
153,200 KB
testcase_23 AC 970 ms
153,088 KB
testcase_24 AC 1,043 ms
153,080 KB
testcase_25 AC 625 ms
117,684 KB
testcase_26 AC 598 ms
113,152 KB
testcase_27 AC 470 ms
108,972 KB
testcase_28 AC 955 ms
142,288 KB
testcase_29 AC 925 ms
144,896 KB
testcase_30 AC 979 ms
152,688 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

from math import hypot, sqrt
from functools import cache


def list3(a, b, c, *, val=0):
    return [[[val] * c for _ in range(b)] for _ in range(a)]


@cache
def distance(a: tuple[int, int], b: tuple[int, int]) -> float:
    return hypot(a[0] - b[0], a[1] - b[1])


def distance2(a, b) -> float:
    x1, y1 = (0, 0) if a == N else houses[a]
    x2, y2 = (0, 0) if b == N else houses[b]
    return sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)


INF = 1 << 60
N, K = map(int, input().split())
houses = []
for _ in range(N):
    x, y = map(int, input().split())
    houses.append((x, y))

dp = list3(1 << N, N, K, val=INF)
# i : 訪問した頂点集合
# j : 最後に訪れた頂点
# k : 持っているピザの枚数
# ときの時間の最小値

# 初期状態
for i, (x, y) in enumerate(houses):
    # d = distance((0, 0), (x, y))
    d = distance2(N, i)
    dp[1 << i][i][K-1] = d

for i in range(1 << N):  # 訪れた頂点集合
    for j in range(N):  # 最後に訪れた頂点
        if ~i & (1 << j): continue
        for k in range(K):  # 持っているピザの枚数
            if dp[i][j][k] == INF: continue

            for to in range(N):  # 次の訪問先
                if i & (1 << to): continue
                b = i | (1 << to)
                # cost = distance(houses[j], houses[to])
                cost = distance2(j, to)
                # 直接向かう
                if k > 0:
                    dp[b][to][k-1] = min(dp[b][to][k-1], dp[i][j][k] + cost)
                # ピザ屋に戻ってから、次の家に向かう
                # cost2 = distance(houses[j], (0, 0)) + distance((0, 0), houses[to])
                cost2 = distance2(j, N) + distance2(N, to)
                dp[b][to][K-1] = min(dp[b][to][K-1], dp[i][j][k] + cost2)

ans = INF
b = (1 << N) - 1
for j in range(N):
    for k in range(K):
        # d = dp[b][j][k] + distance(houses[j], (0, 0))
        d = dp[b][j][k] + distance2(j, N)
        ans = min(ans, d)

print(ans)
0