E. Minimizing Difference

E. Minimizing Difference

【思路】:其实不难发现这个题目,问的是max与min的差值,给了k次操作,我们可以这样考虑一旦一个数变成了下一个数,那么你每次花费的操作就会增加,所以我们只要考虑把最小值变大或者最大值变小,看哪个花费更小,就选择变化哪个,如果一次变化1的话,那么肯定是超时的,所以我们可以考虑一次直接变化到上一个或者下一个,因为个数为1e5,所以我们尺取一下,复杂度为O(n)

原题链接

附上代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
map<int, int>M;
typedef long long LL;
vector<LL>vec;
int main(){
    LL n, m;
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i = 0; i < n; i ++){
        LL num;
        cin >> num;
        M[num] ++;
        vec.push_back(num);
    }
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    int l = 0, r = vec.size() - 1;
    int mins = vec[0], maxs = vec[vec.size() - 1];
    while(m > 0 && l < r){
        if(M[vec[l]] <= M[vec[r]]){
            LL sum = (vec[l + 1] - vec[l]) * M[vec[l]];
            if(sum <= m){
                m -= sum;
                M[vec[l + 1]] += M[vec[l]];
                l ++;
                mins = vec[l];
            }
            else{
                LL x = m / M[vec[l]];
                m = 0;
                mins = vec[l] + x;
            }
        }
        else{
            LL sum = (vec[r] - vec[r - 1]) * M[vec[r]];
            if(sum <= m){
                m -= sum;
                M[vec[r - 1]] += M[vec[r]];
                r --;
                maxs = vec[r];
            }
            else{
                LL x = m / M[vec[r]];
                m = 0;
                maxs = vec[r] - x;
            }
        }
    }
    cout << maxs - mins << endl;
    return 0;
}
posted @ 2019-10-14 22:21  moxin0509  阅读(370)  评论(0编辑  收藏  举报