菜鸟什么时候才能变成老鸟,欢迎留言纠错~|

Shie1d

园龄:5年9个月粉丝:6关注:0

游游的元素修改(携程24秋招研发岗第一批)

题面

游游的元素修改
游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?

输入

第一行输入一个正整数t,代表用例的组数。
对于每组用例:
第一行输入三个正整数n,l,r。
第二行输入n个正整数ai,代表游游拿到的数组。
1<= t <= 1000
2<= n <= 200000
1<= l <= r <= 109
1<= ai <= 109
保证所有的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。

核心思想

贪心
我们统计

  1. 比 l 大的数多出多少 moreThanL
  2. 比 r 少的数少出多少 lessThanR

分别代表我们能够操作 -1 多少次 和 +1 多少次

然后我们再统计

  1. 超出左边界的有多少 needL ,也就说明我们至少需要操作 needL 次 +1 操作
  2. 超出右边界的有多少 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 中国大陆许可协议进行许可。

posted @   Shie1d  阅读(145)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起