首页 > 其他分享 >Acwing 100.增减序列

Acwing 100.增减序列

时间:2023-02-21 13:55:53浏览次数:35  
标签:int sum 差分 负数 数组 增减 100 正数 Acwing

题目

https://www.acwing.com/problem/content/102/

由于题意为每次加一或减一,所以不需要用高级的数据结构。

首先是思考怎么能实现最小次数。

题意描述的是差分的过程,因此这一题肯定和差分有关系,首先根据已知数组构造差分数组,
可以发现差分数组中有正有负,根据差分的性质可以肯定分别选择正负作为差分加减的左右
极可以在最少的次数内将差分数组全部转化为只有正数或负数的数组。此时所需步数为min(
sum(正数),abs(sum(负数)))

第二步容易发现,剩下的正数或负数可以通过a[1]或a[n+1]来转化为0,因为a[1]/a[n+1]不会
改变差分数组的结果。此时需要的步数是多少呢?由于通过第一步我们已经将部分正负数抵消,
因此现在将所有置为0所需要的步数只有(sum(正数)-abs(sum(负数))了。

同时由于第二步可以在不同的位置停下,因此最多情况也是这些。

代码如下

#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
const int N = 1e5+10;
int f[N];
int main()
{
    int n;
    std::cin>>n;
    for(int i=1;i<=n;i++) std::cin>>f[i];
    
    ll y=0,t=0;
    for(int i=2;i<=n;i++) {
        int c = f[i]-f[i-1];
        if(c>0) y+=c;
        else t-=c;
    }
    
    std::cout<<std::max(y,t)<<std::endl<<std::abs(y-t)+1;
    
    return 0;
}

标签:int,sum,差分,负数,数组,增减,100,正数,Acwing
From: https://www.cnblogs.com/2ctheworld/p/17140693.html

相关文章

  • AcWing 1230. K倍区间
    AcWing1230.K倍区间原题链接视频讲解思路求区间的和为k的倍数的区间的个数。首先前缀和数组处理出来。数据范围1e5,要想想O(n)或者O(logn)做法将前缀和数组\(s[n]\)......
  • Acwing352 闇の連鎖(暗之连锁)
    涉及知识点:LCA,树上差分题意题目链接题目乱七八槽的说了一大通,但实际上抽象出来就是:有两种边,一种是主要边,一种是附加边,主要边构成一颗树,附加边为连接树上节点的非树边(注......
  • 【230220-1】已知:a^2-b^2=10,(a+b)^2=100 求:ab=?
    ......
  • Acwing语法基础
    862.三元组排序-AcWing题库#include<iostream>#include<algorithm>#include<string>usingnamespacestd;structTriple{intx;floaty;stringz;......
  • acwing 截断数组
    原题链接题解分析s数组为前缀和数组,这里边录入边转换和能平均分为三份,意思是每一段的和都是s[n]/3先判断一下是否能被整除,分成三段,不能直接输出0,否则进行操作使用......
  • acwing 砖块
    原题链接题解分析这道题目使目标字符串变为同一颜色,也就使只有两种情况W/B因为操作时,操作i会将i+1也操作,所以总操作次数为n-1次如果不能变为全黑或全白也就是che......
  • acwing 318. 划分大理石
      多重背包及优化#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+10;intc[N],S,n,f[N];intsolve(){ inti,j; S=0; memset(f,0,si......
  • acwing 316. 减操作
      类似背包f[i][sum]|=f[i-1][sum-a[i]],这里设置为1或-1 #include<bits/stdc++.h>usingnamespacestd;constintN=2e4+10;constintD=1e4;intn,m......
  • #10091. 「一本通 3.5 例 1」受欢迎的牛
    #include<cstdio>#include<iostream>usingnamespacestd;constintN=1E4+10;constintM=5E4+10;structnode{intto,nxt;}e[M];inthead[N......
  • AcWing 3956. 截断数组 [前缀和]
    AcWing3956.截断数组[前缀和]原题链接讲解视频思路题意是将一串数字从中间切两刀分成三段。每一段的和都相等。要求这三段每一段的和都相等,那么总和肯定是3的倍数,......