这是一道比较贪心的题目。
-1的情况就不必多说,关键是如果可以分成要求的组如何计算出最少的交换次数。
不妨把这个移动分为两种:第一种是小于L需要补,第二种则是大于R需要移走,这两种移动都是必要的。如果两种情况所移动的人数分别为a,b,那么为了满足条件,必然会移动max(a,b)个人。而a,b保证了都是必要移动,所以同时也就是最小移动。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 60;
int n;
int l, r;
int a[N];
int sum;
int x, y;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}
cin >> l >> r;
if (sum<l * n || sum>r* n) {
cout << -1;
return 0;
}
for (int i = 0; i < n; i++) {
if (a[i] < l)
x += l - a[i];
if (a[i] > r)
y += a[i] - r;
}
cout << max(x, y);
return 0;
}