题目描述
洛洛在外出旅游的时候发现社会上文明的现象越来越多,人们在买票的时候都会自发地排队等候。
遗憾的是排队的人身高参差不齐,有时候前后两人之间的身高相差太大,缺乏一些美感。
如果把前后两人的身高差(差值为正数)表示为两者前后相邻时产生的违和度,一段连续的人群因为前后两人身高不同而产生的违和度之和就可以被称为违和值。洛洛希望知道在队伍哪一段,且该段队伍由连续的 m 个人组成,其违和值最小。
输入
第一行输入两个正整数 n, m, n 表示队伍的总人数, m 表示某一段的人数。
第二行输入 n 个整数,表示队伍中 n 个人的身高(单位:厘米)。输出
输出包含一个整数,即最小的违和值。
样例输入
4 3 10 7 5 4
样例输出
3
提示
m=3,要选取 3 个连续的人有两种选法:
10 7 5: 违和度之和=3+2=5
7 5 4: 违和度之和=2+1=3
所以答案是 3。
对于 50%的数据保证 2 ≤ n ≤ 10;
对于 80%的数据保证 2 ≤ n ≤ 1000;
对于 100%的数据保证 2 ≤ n ≤ 100000, 1 ≤ m < n,每个人的身高不超过 300 厘米。
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=1e9,sum[100001],a[100001];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++)
{
sum[i]=sum[i-1]+abs(a[i]-a[i+1]);
}
for(int i=1;i<=n-m+1;i++)
ans=min(ans,sum[i+m-2]-sum[i-1]);
cout<<ans<<endl;
}