AcWing100 IncDec Sequence

求出a的差分序列b,其中b1=a1,b2=a2a1,...bn=anan1

根据题意以及公式可以发现,如果我们想让序列所有的数都一样,那么就是让b2,b3,...bn所有的数全为0,而b1=a1,即b1决定着a的序列有多少种,其中让a序列发生变化,相当对b1,b2,b3,...bn+1任选两个数进行操作,那么有以下几种操作:

  1. 操作bi,bj(2ijn),一加一减或者一减一加,用贪心的方面想这种操作可以更快地改变b序列地值,所以我们应该尽可能多的选这种操作。
  2. 操作b1,bj(2jn),这样只能改变b2,b3,...bn中地一个数。
  3. 操作bi,bn+1(2in),与2同理。
  4. 操作b1,bn+1,相当于对整个序列a操作,没有什么意义。

综上,设b为正数的和为p, b为负数的和为q,对于目的1:用尽可能少的操作使得序列a变成一样的数:
我们可以尽可能多的使用操作1,然后再使用操作23都可以,那么答案就是:

min(p,q)+|pq|=max(p,q)

对于目的2,因为b1=a1,所以说b1的取值就是a序列的取值,所以说我们应该尽可能地使用操作2完成|pq|所以说,答案就是:|pq|+1

#include <bits/stdc++.h>

using namespace std;

const int N = 1E5 + 10;
int n, a[N], b[N];

typedef long long LL;

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) b[i] = a[i] - a[i - 1];

    LL p = 0, q = 0;
    for (int i = 2; i <= n; i++) {
        if (b[i] < 0) p += abs(b[i]);
        if (b[i] > 0) q += b[i];
    }

    cout << max(p, q) << endl << abs(p - q) + 1 << endl;

    return 0;
}
posted @   Xxaj5  阅读(26)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2020-07-29 A-B数对 (hash映射)
2020-07-29 拓扑排序
2020-07-29 树与图的深度优先遍历
2020-07-29 树与图的广度优先遍历
点击右上角即可分享
微信分享提示