Codeforces Round #592 (Div. 2) E

故事扮演 提交于 2020-02-02 01:19:08
题意

kk次操作,每次能使得一个数加1或减1,使最后maxminmax-min最小

题解

首先排序。
考虑在左xx处取最小值,比最小值小的有xx个。
比最大值大的有yy个。
假设差值为rlr-l,x<yx<y
那么显然(r++)(l++)(r++)-(l++)差值不变,但是操作数变小了。
直到yy减少,或者xx增加。
最后除非x=yx=y,否则操作数都可以变小。、
也就是说最佳答案在x=yx=y中。

我们枚举n/2n/2个点,多余的操作数用来减少差距。而不会出现变化最大最小值,因为我们仅在不够到下一点的时候才用多余的操作数。

#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");
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!