NC21545 牛牛的游戏(贪心)

首先发掘题目性质,题目要求,每个点,要不往左要不往右跳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;
    
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12682040.html