游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?
第一行输入一个正整数,代表用例的组数。
对于每组用例:第一行输入三个正整数。
第二行输入个正整数
,代表游游拿到的数组。
保证所有的的总和不超过
。
输出行,每行一个整数,含义如下:
如果无法用有限次数的操作次数使得每个元素大小都在[l,r]范围内,请输出-1。否则输出一个整数,代表最少的操作次数。
2 2 3 5 1 2 3 4 6 3 6 5
-1 1
第一组用例:显然无法用有限次数的操作使得所有元素范围都在[3,5]之间。第二组用例:使第一个数加1,第三个数减1即可,数组变成[4,6,4],满足所有元素不小于4,不大于6。
t = int(input()) def read_nums(): return list(map(int, input().split())) for _ in range(t): n, l, r = read_nums() nums = read_nums() s = sum(nums) if s > r * n&nbs***bsp;s < l * n: print(-1) continue s_l, s_r = 0, 0 for x in nums: if x > r: s_r += x - r elif x < l: s_l += l - x ans = max(s_l, s_r) print(ans)
#include <iostream>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
long long int n, l, r;
cin >> n >> l >> r;
vector<int> vec(n);
for (int i = 0; i < n; i++)
cin >> vec[i];
long long int minAdd = 0, maxAdd = 0, minSub = 0, maxSub = 0;
for (int i : vec)
{
if (i > r)
minSub += i - r;
if (i > l)
maxSub += i - l;
if (i < l)
minAdd += l - i;
if (i < r)
maxAdd += r - i;
}
if (minSub > maxAdd || minAdd > maxSub)
cout << -1 << endl;
else
cout << max(minSub, minAdd) << endl;
}
}