首页 > 试题广场 >

画展布置

[编程题]画展布置
  • 热度指数:1942 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}展厅共有 N 幅画作,其艺术价值为整数 A_1,A_2,\dots ,A_N。策展人需选出其中 M 幅依次摆放。设选出后排成一列的价值为 B_1,\dots ,B_M,定义一个画展的不和谐度 L 满足

L\;=\;\sum_{i=1}^{M-1}\bigl|B_{i+1}^2-B_i^2\bigr|.

\hspace{15pt}请最小化 L 并输出其最小可能值。

输入描述:
\hspace{15pt}第一行输入两个整数 N,M\left(2\leqq M\leqq N\leqq 10^{5}\right)
\hspace{15pt}第二行输入 N 个整数 A_1\dots A_N\left(1\leqq A_i\leqq 10^{5}\right)


输出描述:
\hspace{15pt}输出一个整数,表示最小化后的 L 值。
示例1

输入

4 2
1 5 2 4

输出

3

说明

选择 \{1,2\} 得到 L=2^2-1^2=3,为最小值。
import java.util.*;
import java.io.*;


// 定长滑动窗口统计满足条件的最小区间值
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] line1 = bf.readLine().split(" ");
        int n = Integer.parseInt(line1[0]);
        int m = Integer.parseInt(line1[1]);
        int[] str = Arrays.stream(bf.readLine().split(" ")).mapToInt(
                        Integer::parseInt).toArray();
        Arrays.sort(str);

        long minL = 0; //注意精度问题,L超过21亿的范围
        //第一个窗口的minL
        for (int i = 1; i < m; i++) {
            minL += Math.pow(str[i], 2) - Math.pow(str[i - 1], 2);
        }
        //定长窗口的L
        long conL = minL;
        for (int r = m; r < n; r++) {
            //注意精度损失,int*int结果仍为int,会有损失。pow内隐式转换int为double不会损失。
            //新增元素r的L大小控制变化
            conL += Math.pow(str[r], 2) - Math.pow(str[r - 1], 2);
            //减少元素r-m的L大小控制变化
            conL -= Math.pow(str[r - m + 1], 2) - Math.pow(str[r - m], 2);

            if (conL < minL) {
                minL = conL;
            }
        }
        System.out.println(minL);

    }
}

发表于 2025-08-31 12:08:25 回复(1)