给你一个数组,你最多可以进行k次操作,每次操作可以使一个数+1或者-1,问操作之后数组的极差最小可能是多少
利用map来模拟移动,可以观察到每次应该选择数量少的一组数让他们进行移动是最优的
int main(){ int n; ll k; cin >> n >> k; vector<int> a(n); map<int,int> ls; for(int i = 0 ; i < n ; i++) cin >> a[i],ls[a[i]]++; while(ls.size() > 1) { auto l = ls.begin(); auto r = ls.end(); --r; auto nl = ++l; --l; auto nr = --r; r++; if(l->se <= r-> se) { ll cost = l->se * 1ll * (nl->fi - l->fi); if(k <= cost) break; k -= cost; nl->se += l->se; ls.erase(l); } else { ll cost = r->se * 1ll * (r->fi - nr->fi); if(k <= cost) break; k -= cost; nr->se += r->se; ls.erase(r); } } int c1 = ls.begin()->se; int c2 = ls.rbegin()->se; int mins = k / min(c1 , c2); cout << max(0 , ls.rbegin()->fi - ls.begin()->fi - mins) << endl; }
原文地址:https://www.cnblogs.com/033000-/p/12310444.html
时间: 2024-10-12 11:39:54