题解:P12134 [蓝桥杯 2025 省 B] 画展布置
第一次水题解有点紧张
本题我们很容易想到先排序,利用前缀和暴力的思想对每个数字之间的贡献求出并累加,只需要滑动一次窗口即可求出最小的 L , 但是说不出来这样为什么对。
这里我们来简单证明一下这样贪心的正确性。
题意
定义选取并排列后的画作艺术价值序列为
对应的平方为
让我们求
三角不等式
对任意实数 a 和 b,有三角不等式
当且仅当 a 与 b 同号(或至少其中一个为 0)时取等号。
及其推广:
当且仅当
根据三角不等式,对于任意实数序列都有:
因此,必有:
何时取等号
当且仅当序列
是单调的(即递增或递减)时,三角不等式取等号。又注意到,由于所有艺术价值
因此,当我们将选中的画作按艺术价值从小到大或从大到小排列时,有
优化思路
对于固定的一组
为了使得
经过排序后记为
则可以证明最优方案总可以在排序后的数组中选择连续的
结论
综上,题目中
经排序后,最优排列下转化为了
而最小化
最小。
至此,我们将原评价指标转化为了
代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define endl '\n'
#define all(v) v.begin(), v.end()
void sol()
{
int n, m; cin >> n >> m;
vector<int> A(n);
vector<i64> B(n);
for (int i = 0; i < n; i++) {
cin >> A[i];
B[i] = 1LL * A[i] * A[i];
}
sort(all(B));
i64 ans = LLONG_MAX;
for (int i = m - 1; i < n; i++) {
ans = min(ans, B[i] - B[i - m + 1]);
}
cout << ans << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
sol();
return 0;
}