题意
次操作,每次能使得一个数加1或减1,使最后最小
题解
首先排序。
考虑在左处取最小值,比最小值小的有个。
比最大值大的有个。
假设差值为,
那么显然差值不变,但是操作数变小了。
直到减少,或者增加。
最后除非,否则操作数都可以变小。、
也就是说最佳答案在中。
我们枚举个点,多余的操作数用来减少差距。而不会出现变化最大最小值,因为我们仅在不够到下一点的时候才用多余的操作数。
#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
using namespace std;
typedef long long ll;
const int maxn = 250050;
ll dp[(1<<20)+100];
int A[maxn];
int main(){
int n;ll k;cin>>n>>k;
FOR(i,1,n)sf(A[i]);
sort(A+1,A+1+n);
FOR(i,1,n/2){
ll pro=(A[i+1]-A[i]+A[n-i+1]-A[n-i])*1ll*i;
if(k>=pro)k-=pro;
else{
ll ans=A[n-i+1]-A[i]-k/i;
cout<<ans<<endl;
return 0;
}
}
puts("0");
}
来源:CSDN
作者:mxYlulu
链接:https://blog.csdn.net/mxYlulu/article/details/104134677