补种未成活胡杨

题目描述

近些年来, 我国防沙治沙取得显著成果. 某沙漠新种植N棵胡杨 (编号1-N), 排成一排.

一个月后, 有M棵胡杨未能成活.

现可补种胡杨K棵, 请问如何补种 (只能补种, 不能新种), 可以得到最多的连续胡杨树?

输入描述

  • N 总种植数量, 1 <= N <= 100000
  • M 未成活胡杨数量, M 个空格分隔的数, 按编号从小到大排列, 1 <= M <= N
  • K 最多可以补种的数量, 0 <= K <= M

输出描述

最多的连续胡杨棵树.

示例1

输入:

5
2
2 4
1

输出:

3

说明: 补种到2或4结果一样, 最多的连续胡杨棵树都是3.

示例2

输入:

10
3
2 4 7
1

输出:

6

说明: 种第7棵树, 最多连续胡杨树棵数位6 (5, 6, 7, 8, 9, 10)

题解

Python

def main():
    # 先读取输入值
    # 种树的数量
    total = int(input())
    # 树树的数量
    dead_count = int(input())
    # 死树的位置
    dead_list = list(map(int, input().split()))
    # 补种的数量 k
    k = int(input())
    assert len(dead_list) == dead_count

    # 树的生死状态
    # 0 表示存活, 1 表示不存活
    states = [0] * total

    # 更新树的状态
    # 注意这里是从1开始计数的, 要转换成从0开始计数
    for dead in dead_list:
        states[dead - 1] = 1

    # 双指针法
    left = 0
    right = 0
    # 最大连续存活的树的数量
    max_alive = 0
    # 窗口左侧边界经过的死树的数量
    dead_left = 0
    # 窗口右侧边界经过的死树的数量
    dead_right = 0

    # 遍历所有的树
    while right < total:
        # 更新窗口右侧经过的死树的数量
        dead_right += states[right]

        # 如果窗口内死树的数量比能补种的数量多, 就将窗口左侧往右移
        while dead_right - dead_left > k:
            dead_left += states[left]
            left += 1

        # 更新最大连续活着的树的数量
        max_alive = max(max_alive, right - left + 1)
        right += 1

    print(max_alive)

if __name__ == "__main__":
    main()