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

  

猜你喜欢

转载自www.cnblogs.com/033000-/p/12310444.html