【单调队列优化DP】U301134 绿色通道

题意理解

题目问"最长的空题段至少有多长",等价于问:

是否存在一种抄题方案,使得总时间 ≤ t,且任意连续空题段长度 ≤ x?求这个x的最小值。

解题思路

a. 二分思想

如果空题间隔x过小,可能总时间会超过t;如果x过大总时间达不到t,但不是满足题意条件的最小值。 总时间随着x的增加,可能是不上升的,可以想到二分。我们写一个二分,初始化l=-1(不可取到),r=n(可取)。令mid=(l+r)/2,写个check函数,如果check(mid)返回True,说明x超过了t,这时l=mid;否则r=mid。

b.check函数实现------单调队列优化DP

根据题意,在最大空题间隔为x的情况下,如果最小的空题方案还大于x,那就返回True;否则返回False。所以我们要求在最大空题间隔为x的情况下,能使总时间最短的空题方案。前i题里面,我们记抄了第i题的最短总时间为dpi。

那么对于i(1<=i<=n),我们可以让ai+min{dpj}(i-x-1<=j<=i-1)。这里就可以考虑单调队列。在实现上,前x+1个数有可能i-x-1会下标越界,要特判。我们也可以虚拟一个第0题,耗时0分钟,这个最先入队,就可以不用写特判。

最后,我们的答案会在n-x,n之间找最小值。我们也可以虚拟一个第n+1题耗时0分钟,必做。通过下面的代码,可以把最小值转移到dpn+1上。最后,返回dpn+1>=t。

核心代码

cpp 复制代码
bool check(int x){
	deque<int> dq;
	dq.push_back(0);
	for(int i=1;i<=n+1;i++){
			while(dq.size()&&i-dq.front()>x+1) dq.pop_front();
			int ft=dq.front();
			dp[i]=dp[ft]+a[i];
		while(dq.size()&&dp[i]<=dp[dq.back()]) dq.pop_back();	
		dq.push_back(i);
	}
	return dp[n+1]>=t;
}

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e4+5;
int a[maxn],s,n,t,dp[maxn];
bool check(int x){
	deque<int> dq;
	dq.push_back(0);
	for(int i=1;i<=n+1;i++){
			while(dq.size()&&i-dq.front()>x+1) dq.pop_front();
			int ft=dq.front();
			dp[i]=dp[ft]+a[i];
		while(dq.size()&&dp[i]<=dp[dq.back()]) dq.pop_back();	
		dq.push_back(i);
	}
	return dp[n+1]>=t;
}
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s+=a[i]; 
	}
	int l=-1,r=n;
	while(l+1<r){
		int mid=(l+r)/2;
		if(check(mid)) l=mid;
		else r=mid;
	}
	cout<<r;
	return 0;
} 
相关推荐
y1su2 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan2 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼3 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机3 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1003 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码4 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ4 小时前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法
Rabitebla4 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
远离UE44 小时前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6584 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法