Codeforces Round #592 (Div. 2) E
Posted 033000-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #592 (Div. 2) E相关的知识,希望对你有一定的参考价值。
给你一个数组,你最多可以进行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; }
以上是关于Codeforces Round #592 (Div. 2) E的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #592 (Div. 2)
Codeforces Round #592 (Div. 2)
Codeforces Round #592 (Div. 2) E
Codeforces Round #592 (Div. 2) CF1244A Pens and Pencils题解