游游拿到了一个数组,她每次操作可以使得一个元素加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; } }