题目链接
问题分析
问题需要求移动后最左边的牛与最右边的牛之间的最小距离。
最小距离可能为两种情况:
- 所有的牛都往一个方向移动;
- 靠左边的牛往右移动、靠右边的牛往左移动;
最左边的牛往右移动和其余牛往左移动得到的较小值为左边边界;
最右边的牛往左移动和其余牛往右移动得到的较大值为右边边界;
每次遍历其中的两个变量,记录最小值。
代码
#include <bits/stdc++.h>
using namespace std;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin>>n;
vector<int>p;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
p.push_back(temp);
}
sort(p.begin(),p.end());
int x,mmax=p[n-1],mmin=p[0],res=mmax-mmin;
cin>>x;
for(int i=0;i<n-1;i++){
mmin=min(p[0]+x,p[i+1]-x);
mmax=max(p[i]+x,p[n-1]-x);
res=min(res,mmax-mmin);
}
cout<<res;
return 0;
}