🚙
[ABC258F] Main Street を Pythonで解く
考え方
実装メモ
def highway_pos(B,x,y):
x1,y1,x2,y2 = x//B*B, y//B*B, (x//B+1)*B, (y//B+1)*B
dx,dy = x%B, y%B
pos = [[x1,y,dx], [x2,y,B-dx], [x,y1,dy], [x,y2,B-dy]]
return pos
高速道路上の地点
で求めることができますが、
def highway_dist(B,x1,y1,x2,y2):
if x1%B==0 and x2%B==0 and y1//B==y2//B and x1//B!=x2//B:
return min(y1%B+y2%B, B*2-y1%B-y2%B) + abs(x1-x2)
if y1%B==0 and y2%B==0 and x1//B==x2//B and y1//B!=y2//B:
return min(x1%B+x2%B, B*2-x1%B-x2%B) + abs(y1-y2)
return abs(x1-x2) + abs(y1-y2)
4×4=16パターンについて、所要時間を計算します。ansの初期値には普通道で
def solve():
B,K,Sx,Sy,Gx,Gy = map(int,input().split())
ans = (abs(Sx-Gx) + abs(Sy-Gy)) * K
for x1,y1,distS in highway_pos(B,Sx,Sy):
for x2,y2,distG in highway_pos(B,Gx,Gy):
ans = min(ans, (distS + distG) * K + highway_dist(B,x1,y1,x2,y2))
print(ans)
T個のテストケースについて、solve関数を施行します。
T = int(input())
for _ in range(T):
solve()
Discussion