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题解

Codeforces Round #592 (Div. 2) C - The Football Season(推公式)

Codeforces Round #328(Div2)