AcWing 单调队列优化DP问题 1090. 绿色通道



'''
二分搜索可能的空题段的长度,用单调队列优化的DP验证此
空题段长度下,能够找到合法的选择方案
'''


from collections import deque

n, t = map(int, input().split())
arr = list( map(int, input().split()) )

# 验证空题段长度为emp_len,是否有可行方案
def valid(emp_len):

    # dp(i)表示前i个作业中做选择, 最后一个作业做了的情况下,总开销最小值
    # dp(i) = arr[i] + min(dp(i-1), dp(i-2), dp(i-m))
    # 用单调队列进行计算优化
    dp = [0] * n
    que = deque()

    for idx, val in enumerate(arr):
        if idx <= emp_len-1:
            dp[idx] = arr[idx]
        else:
            dp[idx] = arr[idx] + que[0][1]

        while len(que) > 0 and idx - que[0][0] >= emp_len:
            que.popleft()
        while len(que) > 0 and dp[idx] <= que[-1][1]:
            que.pop()

        que.append( (idx, dp[idx]) )

    return min( dp[-emp_len:] ) <= t

ans = -1
l, r = 1, n
while l <= r:
    mid = l + (r-l) // 2
    if valid(mid):
        ans = mid
        r = mid - 1
    else:
        l = mid + 1

if ans == -1:
    print(n)
else:
    print(ans-1)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值