import math
from scipy.optimize import minimize_scalar

def cable_length(x, L, H1, H2, d, h):
    # Calculate the height of the cable at point x
    y = H1 - (H1 - H2) * (x / L)
    
    # Ensure the rider is at least h + d meters above the ground
    if y - d < h:
        return float('inf')  # Invalid configuration
    
    # Calculate the cable length
    length1 = math.sqrt(x**2 + (H1 - y)**2)
    length2 = math.sqrt((L - x)**2 + (H2 - y)**2)
    return length1 + length2

def find_min_max_length(L, H1, H2, d, h):
    # Find the minimum length
    res_min = minimize_scalar(lambda x: cable_length(x, L, H1, H2, d, h), bounds=(0, L), method='bounded')
    min_length = res_min.fun
    
    # Find the maximum length
    res_max = minimize_scalar(lambda x: -cable_length(x, L, H1, H2, d, h), bounds=(0, L), method='bounded')
    max_length = -res_max.fun
    
    return min_length, max_length

# Example usage:
L = 1000  # Distance between poles
H1 = 100  # Height of first pole
H2 = 100  # Height of second pole
d = 20    # Distance rider hangs below cable
h = 10   # Minimum height above ground

min_length, max_length = find_min_max_length(L, H1, H2, d, h)
print(f"Minimum length: {min_length:.6f} meters")
print(f"Maximum length: {max_length:.6f} meters")
