結果

問題 No.2955 Pizza Delivery Plan
ユーザー noriocnorioc
提出日時 2024-11-09 03:13:05
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,032 ms / 2,000 ms
コード長 1,627 bytes
コンパイル時間 349 ms
コンパイル使用メモリ 82,516 KB
実行使用メモリ 153,000 KB
最終ジャッジ日時 2024-11-09 03:13:26
合計ジャッジ時間 20,075 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 48 ms
53,120 KB
testcase_01 AC 48 ms
52,608 KB
testcase_02 AC 49 ms
60,544 KB
testcase_03 AC 55 ms
63,232 KB
testcase_04 AC 61 ms
66,944 KB
testcase_05 AC 44 ms
53,120 KB
testcase_06 AC 49 ms
60,928 KB
testcase_07 AC 44 ms
52,864 KB
testcase_08 AC 288 ms
103,544 KB
testcase_09 AC 298 ms
102,916 KB
testcase_10 AC 442 ms
107,168 KB
testcase_11 AC 586 ms
112,880 KB
testcase_12 AC 682 ms
117,272 KB
testcase_13 AC 740 ms
121,748 KB
testcase_14 AC 780 ms
126,548 KB
testcase_15 AC 850 ms
130,516 KB
testcase_16 AC 887 ms
134,308 KB
testcase_17 AC 896 ms
138,012 KB
testcase_18 AC 957 ms
140,596 KB
testcase_19 AC 1,002 ms
144,804 KB
testcase_20 AC 1,007 ms
147,604 KB
testcase_21 AC 928 ms
149,896 KB
testcase_22 AC 1,007 ms
153,000 KB
testcase_23 AC 1,005 ms
152,888 KB
testcase_24 AC 1,032 ms
152,976 KB
testcase_25 AC 611 ms
117,160 KB
testcase_26 AC 605 ms
112,668 KB
testcase_27 AC 438 ms
106,796 KB
testcase_28 AC 940 ms
141,820 KB
testcase_29 AC 909 ms
144,840 KB
testcase_30 AC 965 ms
152,220 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

from math import sqrt


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


def distance(a: tuple[int, int], b: tuple[int, int]) -> float:
    dx = a[0] - b[0]
    dy = a[1] - b[1]
    return sqrt(dx ** 2 + dy ** 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))
    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