[python和CSP的姻缘]202109-2 非零段划分

思路

这个题看的时间超级长,主要是不太理解差分,也看不出来怎么联系到那里的
这个题解法很多,快考试了也就不研究那么多解法了,单研究个比较常考的差分法好啦

这里可以理解成找到一个水平线来上下分割
当p值足够大时,所有陆地都被海水淹没了,只有0个岛屿;p下降即海平面下降时,山峰逐渐凸显,每多一个岛屿露出水面,就多一个岛屿,没当一个凹谷出现,两边的岛屿相连就会少一个岛屿

  • 这就可以用两次遍历:
    首先需要设置一个差分数组,index是山的高度即数组A里的数值,对应的值是海平面到这里时岛屿变化的数量
    • 第一次遍历:
      遍历原来读入的数据A,看是山峰还是山谷,山峰的话则在差分数组对应的值里+1;山谷则-1
    • 第二次遍历:
      倒着遍历差分数组,即海平面从高到低下降,累加看后缀和的最大值

代码

n = int(input())
A = list(map(int,input().split()))+[0]
A = [0] + [A[i] for i in range(n) if A[i]!=A[i+1]]+[0]
max_line = max(A)
diff = [0] * ((max_line+1)*2)   # 差分数组

for i in range(1,len(A)-1):
    if A[i-1]<A[i] and A[i+1]<A[i]:     # 山峰
        diff[A[i]] += 1     # 海平面到这个位置的山峰
    elif A[i-1]>A[i] and A[i+1]>A[i]:   # 山谷
        diff[A[i]] -= 1

max_diff = 0
for i in range(max_line,-1,-1):
    diff[i] += diff[i+1]
    max_diff = max(max_diff,diff[i])
print(max_diff)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值