首页 > 试题广场 >

游游的元素修改

[编程题]游游的元素修改
  • 热度指数:991 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?

输入描述:
第一行输入一个正整数t,代表用例的组数。
对于每组用例:
第一行输入三个正整数n,l,r
第二行输入n个正整数a_i,代表游游拿到的数组。
1\le t \le 1000
2\leq n \leq 200000
1\leq l\leq r \leq 10^9
1\leq a_i \leq 10^9
保证所有的n的总和不超过200000


输出描述:
输出t行,每行一个整数,含义如下:
如果无法用有限次数的操作次数使得每个元素大小都在[l,r]范围内,请输出-1。
否则输出一个整数,代表最少的操作次数。
示例1

输入

2
2 3 5
1 2
3 4 6
3 6 5

输出

-1
1

说明

第一组用例:显然无法用有限次数的操作使得所有元素范围都在[3,5]之间。
第二组用例:使第一个数加1,第三个数减1即可,数组变成[4,6,4],满足所有元素不小于4,不大于6。
头像 Mag1c0nch
发表于 2024-11-28 22:31:06
维护一个总和 sum ,如果 sum/n 向下取整大于等于 l 且 sum/n 向上取整小于等于 r ,那么代表一定有解,此时就看超出 l 和 r 的部分谁大了,答案就是大的那个,反之无解 #include <bits/stdc++.h> using namespace std; #de 展开全文
头像 Kato_Shoko
发表于 2024-12-01 13:47:37
#include <iostream> #include <queue> #include <map> #include <set> #include <cmath> #include <cstring> #include &l 展开全文
头像 努力变强2
发表于 2024-11-28 21:33:04
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll>PII; const int N = 2e5 + 10; const int MOD = 9982 展开全文
头像 wdnmdwdnmd
发表于 2024-12-01 22:14:53
#include <algorithm> #include <iostream> #include "bits/stdc++.h" using ll = long long; using namespace std; const int maxn = 2 展开全文
头像
发表于 2024-12-09 19:50:06
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = 展开全文
头像 是基德吖
发表于 2024-12-02 00:43:39
import java.io.*; import java.util.*; import java.math.BigInteger; public class Main { static void solve() { int n = in.nextInt(), l = in 展开全文
头像 whiteg
发表于 2024-12-02 01:59:40
简单贪心 t = int(input()) for _ in range(t): n,l,r = map(int,input().split()) line = list(map(int,input().split())) if n*l <= sum(line) < 展开全文
头像 RunnerQuan
发表于 2025-04-14 21:55:56
贪心! 由于操作时一个数+1,另一个数字-1,所以最终的数组的总和是保持不变的,因此可以知道如果数组的总和sum 在 n * l 和 n * r 之间的话,是一定有解的 然后计算变大变小各自需要的操作次数,取最大值就行(多的那几步就需要利用 [l,r]区间内的某些数进行辅助操作) i 展开全文