画展布置
链接:P12134 [蓝桥杯 2025 省 B] 画展布置 - 洛谷
问题描述:
画展策展人小蓝和助理小桥为即将举办的画展准备了 N 幅画作,其艺术价值分别为 A1,A2,…,AN。他们需要从这 N 幅画中挑选 M 幅,并按照一定顺序布置在展厅的 M 个位置上。如果随意挑选和排列,艺术价值的变化可能会过于突兀,导致观众的观展体验不够流畅。
为了优化布置,他们查阅了《画展布置指南》。指南指出,理想的画展应使观众在欣赏画作时,艺术价值的过渡尽量平缓。指南建议,选择并排列 M 幅画,应使艺术价值的变化程度通过一个数值 L 来衡量,且该值越小越好。数值 L 的定义为:
L=i=1∑M−1∣Bi+12−Bi2∣
其中 Bi 表示展厅第 i 个位置上画作的艺术价值。
现在,他们希望通过精心挑选和排列这 M 幅画作,使 L 达到最小值,以提升画展的整体协调性。请你帮他们计算出这个最小值是多少。
输入格式
输入共两行。
第一行包含两个正整数 N 和 M,分别表示画作的总数和需要挑选的画作数量。
第二行包含 N 个正整数 A1,A2,…,AN,表示每幅画作的艺术价值。
输出格式
输出一个整数,表示 L 的最小值。
输入输出样例
输入
4 2
1 5 2 4
输出
3
说明/提示
评测用例规模与约定
- 对于 40% 的评测用例,2≤M≤N≤1e3,1≤Ai≤1e3。
- 对于 100% 的评测用例,2≤M≤N≤1e5,1≤Ai≤1e5。
解题思路:
由于数值 L 为相邻两个数字的平方之差的总和,那么对于某次取出的 M 个数,这 M 个数字的最小 L 值显然是在其有序时(从小到大 或 从大到小均可)取得。
从小到大排序时:
所以我们只需要先将 A1,A2,…,AN 从小到大排序,随后找到 L 值最小的连续 M 个数。只需要枚举每一个可能的连续 M 个数的起始下标 i,此时 L 值即为 ai+M−12−ai2,取最小的 L 即可。
代码实现:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+6;
ll n,m,a[N];
int main()
{
cin>>n>>m;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
}
sort(a + 1, a + 1 + n);
ll res = 0x7fffffffffffffff;
for(int i = 1; i + m - 1 <= n; i++)
{
ll L = a[i + m -1 ] * a[i + m - 1] - a[i] * a[i];
res = min(res,L);
}
cout<<res;
return 0;
}