B 距离产生美(CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019))

解决一个算法问题,通过修改数组中特定元素的值,确保相邻元素之间的差异大于等于给定阈值,以达到“降温”效果,即创建一个“凉快的数组”。文章探讨了算法思路,包括如何选择要修改的元素及其新值,以及避免重复修改的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值