题解:B4298 [蓝桥杯青少年组国赛 2022] 金箍棒

· · 题解

题目传送门

看不懂大佬写的,只好写个简简单单的桶排(话说这不是黄题吗,感觉别的题解写的至少是绿题的代码)

题意

选定一个长度为 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)**