题解:B4298 [蓝桥杯青少年组国赛 2022] 金箍棒
Yxa_Sheep
·
·
题解
题目传送门
看不懂大佬写的,只好写个简简单单的桶排(话说这不是黄题吗,感觉别的题解写的至少是绿题的代码)
题意
选定一个长度为 k 的区间,求 |a_i-x|+|a_{i+1}-x|+\dots +|a_{i + k - 1}-x| 的最小值,x 为任意自然数。
思路
## 代码
```cpp
#include <bits/stdc++.h>
using namespace std;
int n, k, cnt, x, sum, ans = INT_MAX, a[10010], b[1010];
int main()
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n - k + 1; i++)
{
cnt = 0, sum = 0, memset(b, 0, sizeof(b));
for (int j = 1; j <= k; j++)
b[a[i + j - 1]]++;
for (int j = 1; j <= 1000; j++)
{
cnt += b[j];
if (cnt >= (k - 1 >> 1) + 1)
{
x = j;
break;
}
}
for (int j = 1; j <= k; j++)
sum += abs(a[i + j - 1] - x);
ans = min(ans, sum);
}
printf("%d", ans);
return 0;
}
```
题解来之不易,且看且珍惜。给个赞再走吧。
**[题目传送门](https://www.luogu.com.cn/problem/B4298)**