解题思路
我们对 a 数组进行排序,易证最优决策为:存在位置 i,使得
a
1
—
>
a
i
a_1—>a_i
a1—>ai均加上k ,
a
i
+
1
—
>
a
n
a_{i+1}—>a_n
ai+1—>an 均减去 k。
枚举每一个i 计算答案,
s
u
m
=
m
a
x
(
a
[
n
]
−
a
[
1
]
−
2
∗
k
,
a
[
i
−
1
]
+
2
∗
k
−
a
[
i
]
)
sum=max(a[n]-a[1]-2*k,a[i-1]+2*k-a[i])
sum=max(a[n]−a[1]−2∗k,a[i−1]+2∗k−a[i]),最大的减k与最小的加k的差,和加上k后的数可能大于减去k后的数,则这种情况的最大的差为
a
[
i
−
1
]
+
k
−
(
a
[
i
]
−
k
)
a[i-1]+k-(a[i]-k)
a[i−1]+k−(a[i]−k)
a
n
s
=
m
i
n
(
a
n
s
,
s
u
m
)
ans=min(ans,sum)
ans=min(ans,sum)更新最大的差的最小
代码
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
int n,k,ans,sum,a[100010];
int main(){
freopen("ad.in","r",stdin);
freopen("ad.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
ans=a[n]-a[1];
for(int i=2;i<=n;i++)
{
sum=0;
if(a[n]-a[1]>=2*k)
sum=max(sum,a[n]-a[1]-2*k);
if(a[i-1]+k>a[i]-k)
sum=max(sum,a[i-1]+2*k-a[i]);
ans=min(ans,sum);
}
cout<<ans;
}