游游的元素修改(携程24秋招研发岗第一批)
题面
游游的元素修改
游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?
输入
第一行输入一个正整数t,代表用例的组数。
对于每组用例:
第一行输入三个正整数n,l,r。
第二行输入n个正整数
1<= t <= 1000
2<= n <= 200000
1<= l <= r <=
1<=
保证所有的n的总和不超过200000。
输出
输出t行,每行一个整数,含义如下:
如果无法用有限次数的操作次数使得每个元素大小都在[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。
核心思想
贪心
我们统计
- 比 l 大的数多出多少 moreThanL
- 比 r 少的数少出多少 lessThanR
分别代表我们能够操作 -1 多少次 和 +1 多少次
然后我们再统计
- 超出左边界的有多少 needL ,也就说明我们至少需要操作 needL 次 +1 操作
- 超出右边界的有多少 needR ,也就说明我们至少需要操作 needR 次 -1 操作
如果 needL > needR 说明需要操作 needL 次 +1 操作 才能够让左边界之外的数在边界之内 在操作一定的数量后只可能是剩下一些超出左边界的数而不存在超出右边界的数了。
那么我们需要一些数来执行 -1 操作 ,哪些数可以 -1 呢? 就是我们之前统计的 moreThanL
只要 moreThanL >= needL 就表示有足够的数可以来执行 -1 操作
此时不用考虑在右边界之外的数 因为我们已经计算在 moreThanL 了
needL < needR 的情况同样考虑就OK
代码
import java.util.*;
class Main {
static final int MAXN = 1010;
static long[] res;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
res = new long[t];
Arrays.fill(res, -1);
for(int i = 0; i < t; i++){
int n = scanner.nextInt();
int l = scanner.nextInt();
int r = scanner.nextInt();
// 比l大的有多少 比r小的有多少
long lessThanR = 0, moreThanL = 0;
// 超出左边界的有多少 超出右边界的有多少
long needL = 0, needR = 0;
for(int j = 0; j < n; j++){
long x = scanner.nextLong();
if(x > l)
moreThanL += (x - l);
if(x < r)
lessThanR += (r - x);
if(x < l)
needL += l - x;
if(x > r)
needR += x - r;
}
if(needL >= needR && moreThanL >= needL){
res[i] = needL;
}
if(needL <= needR && lessThanR >= needR){
res[i] = needR;
}
}
for(long num: res){
System.out.println(num);
}
}
}
本文作者:Shie1d
本文链接:https://www.cnblogs.com/ganyq/p/18139112
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步