题目描述:

给定n个数在坐标轴上的位置,这n个数需要左移x个单位或者右移x个单位, 求移动完之后,最右边减去最左边的距离的最小值。

思路:

经过排序之后,容易知道数据具有连续性。 即排序完之后,第i个数字决定左移之后,第i+1到n个数字左移不会对左边界有贡献, 第i个数字右移,第1到i-1个数字右移不会对右边界作出影响。 所以,可得出结论:最终的结果一定是由第i个数字右移,第i+1个数字左移决定的。

注意事项:

因为考虑到第1个数字以及第n个数字的特殊性,第i个数字左移可能比第1个数字右移还要大,第n个数字同理 所以在过程中要与第1个数字的右移进行比较。详细的见代码注释。

using namespace std;
typedef long long ll;
int a[110];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	int x;
	cin>>x;
	int l=a[1]+x;
	int r=a[n]-x;
	int ans=a[n]-a[1];//还需要考虑n=2或1的时候同时左移(或右移)的情况
	for(int i=2;i<=n;i++)//枚举可能成为答案的两个相邻点
	{
		int l1=min(l,a[i]-x);
		int r1=max(r,a[i-1]+x);
		ans=min(r1-l1,ans);
	}
	printf("%d",ans);
	return 0;
}