蓝桥杯算法提高-分苹果(简单题)差分数组算法

1:关于差分数组的使用范围:

  •  常见于数组中某一段需要做连续相同的处理:
  • 多次连续处理,用于减少时间复杂度:可以将是间复杂度从O(N*M)降低到MAX(O(M),O(N));(即暴力枚举不通过时可以考虑的一种方法)

2:差分数组的介绍:

a.我们可以认为差分数组是一个辅助数组,用来从侧面来表示给定某一数组的变化(如对数组进行区间修改的操作)

b.设原数组为a[],差分数组为c[],那么c[i]=a[i+1]-a[i]:举个例子  (0<=i<6)

数组序号 0 1 2 3 4 5 6(额外)
a[] 1 3 9 7 2 1 0
c[] 2 6 -2 -5 -1 -1

             假如对于1——3进行+2操作:

数组序号 0 1 2 3 4 5 6(额外)
a[]原数组 1 3 9 7 2 1 0
a[]目标数组 1 3+3=6 9+3=12 7+3=10 2 1 0
c[]的差分操作 2+3=5 6 -2 -5-3=-8 -1 -1
通过转化得a[] 1 5+1=6 6+6=12 -2+12=10 -8+1-=2 -1+2=1 1-1=0

注意1:

  • 一般我们的数组从i=1开始,将i=0的值置为0,不符合条件的数组可以进行后移一位操作;
  • 差分数组一般比原数组在末尾多一个元素位。
  • 本处只给了一组操作的例子,读者可以继续进行连续操作,同样可以得到目标结果

     原题链接如下:

  • https://www.dotcpp.com/oj/problem1501.htmlhttps://www.dotcpp.com/oj/problem1501.html

#include
int main()
{
 int N,M;
 scanf("%d%d",&N,&M);
 int a[100005]={0};//第一足够长的数组
 for(int i=0;i

此题定位为简单题,思路十分简单,采用暴力枚举的方法基本都会,但当M,N过大时,时间复杂度不给过,于是采用比较简单的差分数组的方法来较少他的时间复杂度(特别感谢c语言网的兄弟们和CSDN的朋友的介绍,小小收获一波),当然也有用分段树的方法来写的,我不是太能理解,有兴趣的读者可以去了解(WU-蓝桥杯算法提高VIP-分苹果 (C++代码)(线段树)-Dotcpp编程社区)。


给向现阶段的我一样的小白或者是有机会看到这儿的学弟学妹的忠告:今天很煎熬,发现了自己现阶段编程的瓶颈,不涉及算法的题大多可以较快解决(90%的入门题,70%-80%的简单题),可是一但上升到中等题,真的束手无策,截止到今天,我已经被一道中等题卡了一天半,实在寸步难行,当然好处是有的,意会不可言传。现在我十分懊悔上个学期没有好好深入去学数据结构,一方面教学质量不行,另一方面我个人学得也是十分的迷茫。其他的不多说,从现在起好好积累算法!加油!

你可能感兴趣的:(c语言的菜鸟进阶刷题记,蓝桥杯,算法,c语言)