蓝桥杯集训·每日一题2025 农夫约翰最喜欢的操作

又是农夫约翰的农场上寒冷而无聊的一天。

为了打发时间,农夫约翰发明了一种关于在整数数组上进行操作的有趣的休闲活动。

农夫约翰有一个包含 N 个非负整数的数组 a 和一个整数 M。

然后,农夫约翰会请贝茜给出一个整数 x。

在一次操作中,农夫约翰可以选择一个索引 i,并对 ai 加 1 或减 1。

农夫约翰的无聊值是他必须执行的最小操作次数,以使得对于所有的 1≤i≤N,ai−x 均可被 M 整除。

对于所有可能的 x,输出农夫约翰的最小无聊值。

将所有情况存入数组中 

1.当ai取余数后 将结果进行n次+1 得到x     

2.当ai 取余数后 将结果进行n次 -1  此时为负数 加上m 得到x

后面运用破环成链以及前缀和来减少时间复杂度

import java.util.Arrays;
import java.util.Scanner;

public class day6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while (t-- != 0){
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            long[] num = new long[2 * n + 1];
            for (int i = 1; i <= n; i++) {
                num[2 * i - 1] = scanner.nextInt()%m;
                num[2 * i] = num[2 * i - 1] + m;
            }
            Arrays.sort(num);
            for (int i = 1; i <= 2*n; i++) {
                num[i] += num[i - 1];
            }
            long res = (long) 1e18;
            for (int j = n; j < n * 2; j++) {
                res = Math.min(res,num[j]-num[(j*2-n)/2+1]*2+num[j-n]+
                        (n/2*2 -n + 2)*(num[(j*2-n)/2+1]-num[(j*2-n)/2]));
            }
            System.out.println(res);
        }
    }
}

你可能感兴趣的:(蓝桥杯,职场和发展)