def main(): import sys input = sys.stdin.read().split() idx = 0 X0 = int(input[idx]) idx += 1 Y0 = int(input[idx]) idx += 1 N = int(input[idx]) idx += 1 points = [] sum_W = 0.0 for _ in range(N): x = int(input[idx]) idx += 1 y = int(input[idx]) idx += 1 w = float(input[idx]) idx += 1 points.append((x, y, w)) sum_W += w # Precompute mask_sum mask_sum = [0.0] * (1 << N) for mask in range(1 << N): s = 0.0 for j in range(N): if mask & (1 << j): s += points[j][2] mask_sum[mask] = s # Precompute distance matrix size = N + 1 # 0..N-1: delivery points, N: liquor store dist = [[0] * (size) for _ in range(size)] for u in range(size): x_u = X0 if u == N else points[u][0] y_u = Y0 if u == N else points[u][1] for v in range(size): x_v = X0 if v == N else points[v][0] y_v = Y0 if v == N else points[v][1] dist[u][v] = abs(x_u - x_v) + abs(y_u - y_v) # Initialize DP INF = float('inf') state_count = 1 << N dp = [[INF] * (size) for _ in range(state_count)] dp[0][N] = 0.0 # mask 0, at liquor store (u=N), time 0 for mask in range(state_count): for u in range(size): current_time = dp[mask][u] if current_time == INF: continue # If all visited, skip (handled later) if mask == (1 << N) - 1: continue # Try visit all unvisited delivery points v (0..N-1) for v in range(N): if not (mask & (1 << v)): new_mask = mask | (1 << v) current_W = sum_W - mask_sum[mask] d = dist[u][v] moving_time = d * (current_W + 100) / 120 unloading_time = points[v][2] total = current_time + moving_time + unloading_time if total < dp[new_mask][v]: dp[new_mask][v] = total # After all state transitions, check return to liquor store min_total = INF full_mask = (1 << N) - 1 for u in range(N): if dp[full_mask][u] == INF: continue d = dist[u][N] return_time = d * (100) / 120 total = dp[full_mask][u] + return_time if total < min_total: min_total = total print("{0:.9f}".format(min_total)) if __name__ == '__main__': main()