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