测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A34375. 金箍棒

填空题 困难

题目描述

金箍棒

题目描述

淘气的悟空变出了N根高度各不相同的金箍棒(1≤高度≤1000),并排列成一排。悟空可以对每根金箍棒施法,让金箍棒高度变短或者变长,但每一次施法只能使一根金箍棒变短1个高度或者变长1个高度。

现在悟空想通过施法将K(K≤N)根相邻的金箍棒高度变为相同,且要求施法的次数最少,请你帮助悟空计算出最少需要施法几次可以使K根相邻的金箍棒高度变为相同。

例如:N=3,K=2,3根金箍棒初始高度分别为:3,6,1。

第一次对高度为3金箍棒施法变长1个高度,变为4;

第二次对高度为6金箍棒施法变短1个高度,变为5;

第三次对高度为4金箍棒施法变长1个高度,变为5;

2根相邻的金箍棒高度变为相同,最少施法3次。

输入描述

第一行输入两个正整数N,K (1≤K≤N≤10000),N表示金箍棒的根数,K表示需要将K根相邻的金箍棒高度变为相同,两个整数之间以一个空格隔开

第二行输入N个各不相同的正整数 (1≤正整数≤1000),表示N根金箍棒的初始高度,N个整数之间以一个空格隔开

输出描述

输出一个整数,表示悟空最少需要施法几次可以使K根相邻的金箍棒高度变为相同

样例输入

3 2

3 6 1

样例输出

3

参考答案

// 参考代码1 #include <bits/stdc++.h> #define N 10005 using namespace std; int a[N]; int sum[N]; int main() { int n, k; scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum[i] = sum[i - 1] + a[i]; } int ans = 0x3f3f3f3f; for (int i = 1; i + k - 1 <= n; i++) { int aver = (sum[i + k - 1] - sum[i - 1] + k - 1) / k; int res = 0; for (int j = i; j < i + k; j++) { res += abs(aver - a[j]); } ans = min(ans, res); } cout << ans << endl; return 0; }
上一题 下一题