首页 > 试题广场 >

画展布置

[编程题]画展布置
  • 热度指数:2589 时间限制: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,为最小值。
from math import inf

def main():
    n, m = map(int, input().strip().split())
    nums = list(map(int, input().strip().split()))

    # 先将被选的n副画作按价值排序,那么要选出来的一定是其中连续的m副
    nums.sort()

    L = 0
    ans = inf
    left = 0

    for right, B in enumerate(nums):
        # 新元素进入
        if right>=1:
            L += abs(B**2-nums[right-1]**2)
        # 移动窗口
        if right-left+1>m:
            L -= abs(nums[left+1]**2-nums[left]**2)
            left += 1
        # 记录答案
        if right+1>=m:
            ans = min(ans, L)
    
    print(ans)

main()

发表于 2026-03-02 19:36:19 回复(0)
n, m = map(int, input().split())
a = list(map(int, input().split()))
a,min1 = sorted(a), float('inf')
for i in range(n-m+1):
    x,y = a[i],a[i+m-1]
    shu = y**2-x**2
    if shu < min1:
        min1 = shu
print(min1)
##此题看似很难,但是我们在做这种题的时候,都一定是转化为单循环,双循环必超时,由于不和谐度与数之间的差值和和有关,因为x平方减y平方等于x与y的和乘以x与y的差,所以xy应该尽量小,且差值也应该小,所以此时可以直接sorted,之后可以发现,因为排序后Bi的值一直在增大,所以可以去掉绝对值,所以化简成了最后一个数的平方减去第一个数的平方,由此转化成了单循环

发表于 2025-08-14 09:46:42 回复(0)