F 题 Baseball
题意
-
关键字
-
Takahashi 选择了 K K K 个整数 x 1 , x 2 , … , x K x_1, x_2, \dots, x_K x1,x2,…,xK。
-
Aoki 随机选择一个整数 y y y,其选择概率与数列 P P P 中对应元素的比例有关。
-
Aoki 的得分为 min i = 1 K ∣ x i − y ∣ \min{i=1}^{K} |xi - y| mini=1K∣xi−y∣。
-
Takahashi 的目标是使 Aoki 的得分期望值最小化。
-
输出 Aoki 得分期望值的最小值乘以 ∑ y ′ = 1 N P y ′ \sum{y'=1}^{N} P{y'} ∑y′=1NPy′。
-
分析
-
策略
-
如果 Takahashi 选择 x 1 , x 2 , … , x K x_1, x_2, \dots, x_K x1,x2,…,xK,则 Aoki 的得分期望值取决于这些点在数轴上的分布情况和概率加权。
-
最优策略通常涉及选择离散分布的中位数或平均值,以最小化距离的期望值。
-
-
实现
-
对数列 P P P 进行排序,以便能够快速找到累积概率和中位数。
-
计算每个可能的 y y y 值对应的 Aoki 得分期望值。
-
选择使得期望值最小的 x 1 , x 2 , … , x K x_1, x_2, \dots, x_K x1,x2,…,xK。
-
使用前缀和数组加速计算累积概率。
-
使用双指针或类似的方法找到最小期望值。
-
最终计算输出结果。
-
code:
#include <bits/stdc++.h>
using namespace std;
int n, k;
int main() {
cin >> n >> k;
vector<int> p(n);
for (int i = 0; i < n; ++i) {
cin >> p[i];
}
sort(p.begin(), p.end());
vector<long long> sum(n);
sum[0] = p[0];
for (int i = 1; i < n; ++i) {
sum[i] = sum[i - 1] + p[i];
}
long long minn = LLONG_MAX;
for (int i = 0; i <= n - k; ++i) {
long long sump = sum[i + k - 1] - (i > 0 ? sum[i - 1] : 0);
long long cnt = 0;
cnt += (long long)p[i] * i;
cnt += sump - (long long)p[i] * (i + k);
minn = min(minn, cnt);
}
cout << minn << endl;
return 0;
}