码迷,mamicode.com
首页 > 其他好文 > 详细

E. Minimizing Difference

时间:2019-10-15 00:04:08      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:size   min   增加   turn   pac   操作   ons   就会   long   

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;
}

E. Minimizing Difference

标签:size   min   增加   turn   pac   操作   ons   就会   long   

原文地址:https://www.cnblogs.com/qq136155330/p/11674617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!