题目描述:
给定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;
}