結果

問題 No.2955 Pizza Delivery Plan
ユーザー noriocnorioc
提出日時 2024-11-09 03:00:47
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,012 bytes
コンパイル時間 327 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 115,884 KB
最終ジャッジ日時 2024-11-09 03:00:58
合計ジャッジ時間 10,454 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 52 ms
60,672 KB
testcase_01 AC 53 ms
55,552 KB
testcase_02 AC 61 ms
63,104 KB
testcase_03 AC 71 ms
66,944 KB
testcase_04 AC 84 ms
71,296 KB
testcase_05 AC 55 ms
55,680 KB
testcase_06 AC 60 ms
63,232 KB
testcase_07 AC 53 ms
55,552 KB
testcase_08 AC 1,425 ms
103,680 KB
testcase_09 AC 1,412 ms
104,064 KB
testcase_10 TLE -
testcase_11 TLE -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
権限があれば一括ダウンロードができます

ソースコード

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 hypot(x1-x2, y1-y2)
    # 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