CCF202109-2 非零段划分(100分)【序列处理】_海岛Blog-CSDN博客_ccf非零段划分
思想来自这位大佬的第三个方法,给大家把这段话复制过来了。大家可以根据链接去原文章看看。借用岛屿情况来分析这个题。考虑p足够大的情况,所有的数都被海水淹没了,只有0个岛屿。然后,海平面逐渐下降,岛屿数量出现变化。每当一个凸峰出现,岛屿数就会多一个;每当一个凹谷出现,原本相邻的两个岛屿就被这个凹谷连在一起了,岛屿数减少一个。使用数组cnt[],cnt[i] 表示海平面下降到i时,岛屿数量的变化。 差分法是最简洁的解题程序。数组元素d[i]中存储该元素被替换为0时,划分数变化的差分值。最大值则只需要从其前缀和(程序中实际为后缀和)中找出最大值就是所要的结果。
n = int(input())
a = list(map(int,input().split()))
b = []
b.append(a[0])
i = 0
for i in range(1,n): #消除相邻重复的数
if a[i-1] != a[i]:
b.append((a[i]))
x = max(b) #用x来存储列表b中的最大的数
c = [ 0 for i in range(10001)] # c 的索引就表示 水位下降到这个索引时 非零段(山峰)是增加1 还是减少了1
b.insert(0,0) #在第一个索引之前加入一个0 方便去比较
b.append(0) #在最后加入0
for i in range(1,len(b)-1):
if b[i-1] < b[i] and b[i] > b[i+1]: #若比相邻的俩个数都大,就说明下降到这个水位后 非零段增加1
c[b[i]] += 1
elif b[i-1] > b[i] and b[i]