首先发掘题目性质,题目要求,每个点,要不往左要不往右跳x
因此我们可能先想到排序,之后初始化答案为a[n]-a[1]
那么接下来考虑使用贪心的想法,首先,在接下来的情况左边界肯定不会往左挑,有边界肯定不会往右跳
而且我们要使左边界尽可能大,右边界尽可能小。所以枚举每个点的跳跃情况时,就找一下左右边界最近能到什么地方
左边界肯定是a[1]+x和a[i+1]-x的最小值,这里取最小的意思是最大的最小值。右边取a[n]-x和a[i]+x的最大值
之后更新答案即可
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=1e5+10; ll a[N]; int main(){ int i; int n; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; int x; cin>>x; sort(a+1,a+1+n); ll ans=a[n]-a[1]; for(i=1;i<n;i++){ ll l=min(a[1]+x,a[i+1]-x); ll r=max(a[n]-x,a[i]+x); ans=min(ans,r-l); } cout<<ans<<endl; }