题目描述
Farmer John最讨厌的农活是运输牛粪。为了精简这个过程,他制造了一个伟大的发明:便便传送门!与使用拖拉机拖着装满牛粪的大车从一个地点到另一个地点相比,他可以使用便便传送门将牛粪从一个地点瞬间传送到另一个地点。
Farmer John的农场沿着一条长直道路而建,所以他农场上的每个地点都可以简单地用该地点在道路上的位置来表示(相当于数轴上的一个点)。一个传送门可以用两个数x和y表示,被拖到地点x的牛粪可以瞬间传送到地点y,反之亦然。
Farmer John想要将牛粪从地点a运输到地点b,他建造了一个可能对这一过程有所帮助的传送门(当然,如果没有帮助,他也可以不用)。请帮助他求出他需要使用拖拉机运输牛粪的总距离的最小值。
输入描述:
输入仅包含一行,为四个用空格分隔的整数:a和b,表示起始地点和结束地点,后面是x和y,表示传送门。所有的位置都是范围为0…100的整数,不一定各不相同。
输出描述:
输出一个整数,为Farmer John需要用拖拉机运输牛粪的最小距离。
示例1
输入
3 10 8 2
输出
3
说明
在这个样例中,最佳策略是将牛粪从位置3运到位置2,传送到位置8,再运到位置10。 所以需要用拖拉机的总距离为1 + 2 = 3。
解答
这里的传送门可以双向传送,但是我们最多使用一次传送门就够了(显而易见读者自证)
我们要分三种情况讨论
一,不使用传送门
答案为两点的直线距离|a−b|
二,使用传送门从左边到右边
答案为起点到左侧传送门的直线距离加上右侧传送门到终点的直线距离
三,使用传送门从右边到左边
与二同理
最后输出三种情况的最小值即可
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int main() { int maxn=99999999; int a,b,x,y; scanf("%d%d%d%d",&a,&b,&x,&y); maxn=min(abs(x-a)+abs(y-b),min(abs(x-b)+abs(y-a),abs(b-a))); printf("%d",maxn); return 0; }
来源:千柒/Kan_kiz