题目描述:
小红定义一个数组的“平滑值”为:相邻两数差的绝对值的最大值。
具体的,数组a的平滑值定义为
现在小红拿到了一个数组。她每次操作可以在两个元素之间添加一个整数(不能添加在第一项前面或者最后一项后面)。小红希望最终数组的平滑值恰好等于k,你能帮小红求出最小的操作次数吗?
坑点: 这个题有一个坑点,卡了我半个小时,当读入
5 2
1 2 3 4 5
这种情况要注意,没有一种情况是符合的,差值最大才是1,所以我们还要记得挑选出每一步的差值的最大,看看mmax是否大于k,如果没有,那么必须操作一次,对应ans++
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long L;
L n,k,ans,mmax;
int arr[200005];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>arr[i];//输入数值
for(int i=2;i<=n;i++)
{
int temp=abs(arr[i]-arr[i-1]);//判断差值
if(temp>mmax) mmax=temp;//找到整个数列的差值的最大
//这一步其实在“坑点”部分解释过了
if(temp>k)//差值太大了,需要插入数
{
ans+=(temp-1)/k;//看看需要插入几个数
}
}
if(ans==0&&mmax<k) ans++;//数太小ans++
cout<<ans;
return 0;
}