洛谷P1714切蛋糕

题目

该题目就是求这n个数的前缀和所组成的数组的所有子区间的左端点和右端点相差不超过m,且他们的前缀和差最大,求出这个最大值即可。

而朴素算法肯定会T,而我们发现如果前缀和最大的话,则前缀和的值一定是满足单调递增的,因此可以用单调队列优化。

#include <iostream>//单调队列,队列里满足后加的数要比之前的大 
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define N 500011		
using namespace std;	
deque <int> qmax;		
int n, m, ans;				
int data[N], sum[N];		
int main()					
{							
 	scanf("%d%d", &n, &m);	
 	for (int i = 1; i <= n; i++)
 	 	scanf("%d", &data[i]), sum[i] = sum[i - 1] + data[i];
 	for (int i = 1; i <= n; i++)
 	{
	 	while (qmax.size() && sum[i] < sum[qmax.back()]) //队列中要满足单调递增,而为什么要选择出队,而不选择不加入该数呢,因为队列中的值已经更新了ans所以已经没用了,但是加入的数还有可能更新答案,因此需要加入该数 
			qmax.pop_back();
	 	qmax.push_back(i);	
	 	while (qmax.back() - qmax.front() > m) qmax.pop_front();
 	 	ans = max(ans, sum[qmax.back()] - sum[qmax.front()]);//sum[qmax.front()]一定是最小的
 	}		
 	printf("%d", ans);
 	return 0;			
}
posted @   DAGGGGGGGGGGGG  阅读(135)  评论(0编辑  收藏  举报
编辑推荐:
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
· 大模型 Token 究竟是啥:图解大模型Token
· 35岁程序员的中年求职记:四次碰壁后的深度反思
阅读排行:
· 基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 上周热点回顾(3.31-4.6)
· 爆肝 1 周,为我的白板工具支持了 mermaid 流程图,为 ai 生成流程图铺平道路
历史上的今天:
2018-06-19 二分图最大匹配
点击右上角即可分享
微信分享提示