题目描述
JWJU放暑假了,于是鸡尾酒就和女朋友璇璇一起出去玩。但是外面太热了,只要他们牵牵手就会手心出汗。鸡尾酒觉得在这些热的地方就应该保持距离,不然就实在热的受不了了!
现在鸡尾酒获得了一个长度为n的数组,且第i个元素为ai
这个数组他看着都热——相邻两个元素实在太接近了。他觉得对于任意的 i(1<i≤n),都必须满足 |ai-a(i-1)|>=k,才能被称为“凉快的数组”。
多管闲事的鸡尾酒想帮这个数组降降温。他每一次可以把一个元素改成 [0,10^{18}] 中的任意值,请问他最少修改几个元素,才能使得这个数组变为“凉快的数组”。
输入描述
第一行一个正整数输入 n, k,接下来一行包含 nn 个正整数,依次表示 ai(1<=n<=1e5,0<=ai,k<=1e9)
输出描述
输出一行一个正整数表示最少的修改次数
样例输入
3 5
1 1 2
样例输出
1
提示
可以将中间的数字改为8,这样原数组变为[1,8,2]
思路:先将左右都不符合的最中间的更改,最后看单个不符合的,注意可能会有重复更改的情况,需要在更改完后i++跳过。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define fori(a,b) for(int i=a;i<=b;i++)
#define forj(a,b) for(int j=a;j<=b;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const int M=1e5+10;
#define inf 0x3f3f3f
int a[M];
int main()
{
int n,k,i,j,ans=0,ans1=0;
cin>>n>>k;
for(i=0;i<n;i++)
cin>>a[i];
for(i=1;i<n-1;)
{
if(abs(a[i]-a[i-1])<k&&abs(a[i]-a[i+1])<k)
{
a[i]=max(a[i-1],a[i+1])+k+k;
ans++;
i++;
}
i++;
}
for(i=1;i<n;i++)
{
if(abs(a[i]-a[i-1])<k)
{
a[i]=max(a[i-1],a[i])+k+k;
ans++;
i++;
}
}
cout<<ans<<endl;
return 0;
}