結果

問題 No.2955 Pizza Delivery Plan
ユーザー noriocnorioc
提出日時 2024-11-09 02:49:54
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,629 bytes
コンパイル時間 332 ms
コンパイル使用メモリ 82,432 KB
実行使用メモリ 124,788 KB
最終ジャッジ日時 2024-11-09 02:50:07
合計ジャッジ時間 12,475 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 56 ms
60,928 KB
testcase_01 AC 54 ms
56,872 KB
testcase_02 AC 64 ms
64,640 KB
testcase_03 AC 68 ms
68,736 KB
testcase_04 AC 86 ms
77,568 KB
testcase_05 AC 56 ms
56,192 KB
testcase_06 AC 62 ms
64,384 KB
testcase_07 AC 56 ms
56,320 KB
testcase_08 AC 817 ms
104,160 KB
testcase_09 AC 790 ms
104,292 KB
testcase_10 AC 1,474 ms
109,364 KB
testcase_11 TLE -
testcase_12 TLE -
testcase_13 TLE -
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
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])


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))
    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])
                # 直接向かう
                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])
                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))
        ans = min(ans, d)

print(ans)
0