题意:
在一条直线上存在三个点(有坐标),并给出一个距离d,求至少移动多少个单位(可左可右)才能使得两两点之间的距离不小于该距离。
思路:
因为三个点是没有身份或者先后区别的,所以首先对三个点进行排序,得出最小的点和中间点的距离d_1,和最大点和中间点的距离d_2,那么只要这两个距离满足,就显然满足了。那么就存在下面的情况
1、d_1 > = d && d_2 < d,那么只要移动最大点(继续变大)
2、d_2 > = d && d_1 < d,那么只要移动最小点(继续变小)
3、d_1 < d && d_2 < d,那么需要同时移动最大(变大)和最小点(变小)
4、d_1 > = d && d_2 >= d,那么需要移动次数为 0
代码:
#include<iostream>
#include <algorithm>
using namespace std;
int Array[3];
int main(){
int d;
int temp_1, temp_2;
while(cin >> Array[0] >> Array[1] >> Array[2] >> d){
if(Array[0] < 1 || Array[1] < 1 || Array[2] < 1 || d < 1) return 0;
sort(Array,Array+3);
temp_1 = abs(Array[1] - Array[0]);
temp_2 = abs(Array[2] - Array[1]);
if(temp_1 < d && temp_2 < d){
cout << (2*d - temp_1 - temp_2) << endl;
continue;
}
if(temp_1 < d && temp_2 >= d){
cout << (d - temp_1) << endl;
continue;
}
if(temp_1 >= d && temp_2 < d){
cout << (d - temp_2) << endl;
continue;
}
cout << 0 << endl;
}
return 0;
}