AcWing 100. 增减序列详解

文章讨论了如何通过差分数组解决一个问题,目标是最少操作次数使数组元素满足特定条件。涉及正负数配对、数组种类数计算以及代码实现,使用longlong防止整数溢出。
摘要由CSDN通过智能技术生成

原题链接:https://www.acwing.com/problem/content/101/

题目分析

题目中描述的操作需要我们使用差分数组

最少操作数

a区间的加减一可以变为差分数组b中两个元素left和right+1的加减1。

因为bi=ai-a(i-1)所以最后就是差分数组从2到n全部变为0,只剩下1和n+1

b[1]=a[1],也就是说最后所有元素都等于第一个元素

b[n+1]=a[n+1]-a[n];它存在是因为有时候要修改a[n]

最少的操作数就是将正负数配对一个加一个减,但是可能有数不够用

我们可以用a[1]和a[n+1]但是他们不用==0所以是min(pos, neg)+abs|pos-neg|

数组种类数

我们可以选择操作b1或者bn+1,

选择bn+1好了,这时候我们每次的加减1可以包含进去b1也可以不包含

所以b1的取值有abs|pos-neg|+1种

代码细节

  • min(pos, neg)+abs|pos-neg|=max(pos, neg)
  • 用longlong防止爆int

c++代码

#include<bits/stdc++.h>

using namespace std;

const int N  = 1e5 + 10;

int b[N], a[N];
long long pos, neg;

int main(){
    int n;
    cin >> n;
    
    for(int i = 1;i <= n;i++){
        cin >> a[i];
        b[i] = a[i] - a[i - 1];
    }
    
    for(int i = 2;i <= n;i ++){
        if(b[i] > 0) pos += b[i];
        else  neg -= b[i];
    }
    
    cout << max(pos, neg) << endl;
    cout << abs(pos - neg) + 1;

}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值