zl程序教程

您现在的位置是:首页 >  其它

当前栏目

1737. 传送(分类讨论)

分类 讨论 传送
2023-09-14 09:14:58 时间

文章目录

Question

Farmer John 最讨厌的农活是运输牛粪。

为了精简这个过程,他制造了一个伟大的发明:便便传送门!

与使用拖拉机拖着装满牛粪的大车从一个地点到另一个地点相比,他可以使用便便传送门将牛粪从一个地点瞬间传送到另一个地点。

Farmer John 的农场沿着一条长直道路而建,所以他农场上的每个地点都可以简单地用该地点在道路上的位置来表示(相当于数轴上的一个点)。

一个传送门可以用两个数 x 和 y 表示,被拖到地点 x 的牛粪可以瞬间传送到地点 y,反之亦然。

Farmer John 想要将牛粪从地点 a 运输到地点 b,他建造了一个可能对这一过程有所帮助的传送门(当然,如果没有帮助,他也可以不用)。

请帮助他求出他需要使用拖拉机运输牛粪的总距离的最小值。

输入格式
输入仅包含一行,为四个用空格分隔的整数:a 和 b,表示起始地点和结束地点,后面是 x 和 y,表示传送门。

所有的位置都是范围为 0…100 的整数,不一定各不相同。

输出格式
输出一个整数,为 Farmer John 需要用拖拉机运输牛粪的最小距离。

输入样例:
3 10 8 2
输出样例:
3
样例解释
在这个样例中,最佳策略是将牛粪从位置 3 运到位置 2,传送到位置 8,再运到位置 10。

所以需要用拖拉机的总距离为 1+2=3。

Ideas

分三种情况讨论
ab之间有两个传送
ab之间无传送
ab之间有一个传送

Code

a,b,x,y = list(map(int,input().strip().split()))

if a > b:
    a,b = b,a
if x > y:
    x,y= y,x

# 1.a和b之间有俩传送
if a<=x and b>=y:
    print(x-a+b-y)

# 2. a和b之间有一个传送
elif a<x<b and y>b: 
    print(min((b-a),(x-a+y-b)))
elif  a<y<b and x<a:
    print(min((b-a),(a-x+b-y)))
    
# 3.a和b之间无传送
else:
    print(b-a)