【算法每日一练]-单调队列(保姆级教程 篇2)#琪露诺 #选数游戏 #寻找段落

最后一期单调队列了啊

目录

题目:琪露诺

 思路:

题目:选数游戏

思路: 

题目:寻找段落

思路:


        

        

之前做的都是连续的长度区间求最值,今天体验一下不连续的区间。

然后就是要注意维护单调队列时维护的是哪个数组?在的哪个区间?

        

题目:琪露诺

       

 思路:

     

首先f[i]表示走到i格子时获得最大和:f[i]=max(f[i-r]~f[i-l])+v[i]

常规做法O(n^2)会超时  那就维护f数组[i-r,i-l]的单调队列,当遍历i时,维护f[i-r,i-l]的最大值的单调队列,不是原数组v!!!

     
入队新元素为i-l  所以h<=t&&f[q[t]]<f[i-l],队尾才能出队,然后i-l入队
队头过期元素和i-r比较  所以h<=t&&q[h]<i-r,队头下标比i-r还小就要丢掉
更新f[i]:f[i]=f[q[h]]+v[i]
      

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+86;
int n,f[N],l,r,ans=-0x3f3f3f3f,v[N],q[N],h=1,t=0;//其实h和t的值不重要,只要h==t就是队中仅1个元素,h>t队空,里面存放的下标才是关键
//有负数所以 ans 初始化为负无穷
int main()
{	
	memset(f,-0x3f,sizeof(f));f[0]=0;
	scanf("%d%d%d",&n,&l,&r);
	for(int i=0;i<=n;i++)
		scanf("%d",&v[i]);
	for(int i=l;i<=n;i++)//遍历到i时,我们的新入队元素应该是i-l,不是i
	{
		while(h<=t&&q[h]<i-r) h++;//过期队头出队
		while(h<=t&&f[q[t]]<f[i-l]) t--;//维护[i-r,i-l]的单调最值
		q[++t]=i-l;//新元素i-l入队
		f[i]=f[q[h]]+v[i];//从最值中取出更新f[i]
		if(i+r>n) //及时更新答案
			ans=max(f[i],ans);
	}
	printf("%d\n",ans);
	return 0;
}

         

可以欣赏一下这个超时版本


//朴素版本:    超时版本
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+1;
int n,l,r,a[maxn],f[maxn],ans=-1<<30;
int main()
{
	scanf("%d%d%d",&n,&l,&r);
	for(int i=0;i<=n;i++) scanf("%d",&a[i]);
	memset(f,0xcf,sizeof(f));f[0]=0;//由于冰冻指数可能是负数,所以一定要记得初始化
	for(int i=l;i<=n+r-1;i++)//第一步至少跳到第l格,最后一步至多跳到第n+r-1格 
	{
		for(int j=max(0,i-r);j<=i-l;j++) f[i]=max(f[i],f[j]+a[i]);
		if(i>=n) ans=max(ans,f[i]);//已经跳到对岸了再更新答案 
	}
	printf("%d",ans);
	return 0;
}

       

        

题目:选数游戏

     

思路: 

              

不同于连续的区间和,这个若干离散长度,且最大连续不超过k,和之前做法不一样。

每个点都有两种状态,被选上和未被选上,但是不能有连续超过k个被选上,那么不被选上的数应该会很少。      

     

我们设置f[i] 代表第i个点不取的最优解。状态转移:f[i]=max{f[j],sum[j+1~i-1]}(i-j<=k)向后递推,最终求解f[n+1]即可(f[j]是不被选上的,故不能加上a[j])

       
那么如何判优呢?

假设从f[a]转移到f[c]优于f[b]转移到f[c](a<b<c) 则f[a]+sum[c-1]-sum[a]>=f[b]+sum[c-1]-sum[b] 易得f[a]-sum[a]>=f[c]-sum[b]

      
故我们维护一个f[j]-sum[j]数组[i-k-1~i-1]的单调队列,遍历每个i不断取出最大值即可

      
入队新元素为i-1  所以h<=t&&f[q[t]]-suf[q[t]]<f[i-1]-suf[i-1]
过期队头和i-k-1比较  所以h<=t&&q[h]<i-k-1  取等时成立
更新f[i]  f[i]=f[q[h]]+suf[i-1]-suf[q[h]]
 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[N],n,k,q[N];
ll suf[N],f[N];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i],suf[i]=suf[i-1]+a[i];
	int h=1,t=0;
	for(int i=1;i<=n+1;i++){
		while(h<=t&&f[q[t]]-suf[q[t]]<f[i-1]-suf[i-1])t--;//这个一定要在最前面,因为这一步可能影响到q[h]
		q[++t]=i-1;
		while(h<=t&&q[h]<i-k-1)h++;
		f[i]=f[q[h]]+suf[i-1]-suf[q[h]];
	}
	cout<<f[n+1];
}

      

       

题目:寻找段落

        

思路:

      

注意到段落长度是个范围(还很大),只能二分来做,那么是对段落长度二分吗? 这样的话怎么对获得的最大平均值来调整段落长度呢?

     
其实我们应该对最大平均值二分,然后根据题目的这个段落能不能达到,若能达到就继续减小最大平均值mid!!!

     
操作:

首先对数组减去mid,那么只需要判断[s,t]的段落中有没有出现>=0,如果出现就说明答案至少是它,可以尝试增加mid
    

再细节一点:假如遍历到了i,那么只需要看看suf[i]-max(suf[i-T~i-S])有没有>=0,故我们要维护一个suf数组[i-T, i-S]到最大值的单调队列,从而遍历所有i

       
入队新元素为i-S  所以h<=t&&suf[q[t]]>suf[i-S] 
过期队头和i-T比较  所以h<=t&&q[h]<i-T  取等时也成立
判断suf[i]-suf[q[h]]>=0成不成立即可
      

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
double l,r,mid,a[N],suf[N];
int n,S,T,q[N];
int check(double mid){
	int h=1,t=0;
	suf[0]=0;
	for(int i=1;i<=n;i++) suf[i]=suf[i-1]+a[i]-mid;//初始化前缀和数组
	for(int i=S;i<=n;i++){
		while(h<=t&&suf[q[t]]>suf[i-S])t--;//维护单调性,新元素为suf[i-S]哦
		q[++t]=i-S;//入队
		while(h<=t&&q[h]<i-T)h++;//过期的出队
		if(h<=t&&suf[i]-suf[q[h]]>=0)return 1;//判断每个[S,T]长度的段落有没有>=0
	}
	return 0;
}
int main(){
	cin>>n>>S>>T;
	for(int i=1;i<=n;i++)cin>>a[i];
	l=-100000,r=100000;
	while(r-l>1e-5){//二分精确模板
		mid=(l+r)/2;
		if(check(mid))l=mid;
		else r=mid;
	}
	printf("%.3f",mid);
}

好了,讲完了,各位观众老爷们点个赞再走吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/139876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

说说你对immutable的理解?如何应用在react项目中?

一、是什么 Immutable,不可改变的,在计算机中,即指一旦创建,就不能再被更改的数据 对 Immutable对象的任何修改或添加删除操作都会返回一个新的 Immutable对象 Immutable 实现的原理是 Persistent Data Structure(持久化数据结构): 用一种数据结构来保存数据当数据被修…

1.jvm基本知识

目录 概述jvm虚拟机三问jvm是什么&#xff1f;java 和 jvm 的关系 为什么学jvm怎么学习为什么jvm调优?什么时候jvm调优调优调什么 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址 jvm虚拟机三问 j…

OpenCV:图像矫正与仿射变换

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

Java_常用API

API(全称Application Programming Interface:应用程序编程接口) String 常用方法 注意事项 每一次试图改变字符串对象都产生了新的字符串对象 ArrayList 常用方法 ATM系统 01系统架构搭建、欢迎页设计 02开户功能实现 03登录功能实现 04操作页展示、查询账户、退出账户 05存…

笔尖笔帽检测1:笔尖笔帽检测数据集(含下载链接)

笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 目录 笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 1. 前言 2. 手笔检测数据集 &#xff08;1&#xff09;Hand-voc1 &#xff08;2&#xff09;Hand-voc2 &#xff08;3&#xff09;Hand-voc3 …

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算 在用Allegro进行PCB设计的时候,Cross-section中需要填入对应的信息,一般填入每层的厚度即可,如下图 当PCB需要进行仿真分析的时候,Etch-Factor这个值是必须要填写的,如下图 目前看到的都是90这个值,这是一个理论值。 …

iOS群控手机App的开发难点是什么?

随着智能手机的普及&#xff0c;手机App已经成为我们生活中不可或缺的一部分&#xff0c;在众多手机操作系统中&#xff0c;iOS系统因其封闭性、安全性和流畅性而备受用户青睐&#xff0c;然而&#xff0c;开发一款针对iOS系统的手机App却并非易事。 一、开发语言与框架 iOS系…

【IDE】【实战系列】掌握这些技巧发现阅读源码不过如此简单

文章目录 IDE 版本前言IDE Debug主界面介绍字段断点&#xff08;field breakpoints&#xff09;使用方式配置EnabledSuspendLog 行断点&#xff08;line breakpoints&#xff09;使用方式配置方式 方法断点&#xff08;method breakpoints&#xff09;使用方式配置方式 异常断点…

datax 搭建使用

文章目录 datax 环境搭建使用一、解压文件二、配置 json 文件三、执行命令 datax 环境搭建使用 用于全量同步 一、解压文件 将包上传至服务器 输入命令&#xff1a; tar -zxvf datax.tar.gz -C /opt/module/ 将包 解压到 /opt/module 目录 解压完之后&#xff0c;不需要任何…

在线教育与跨境电商:数字时代的知识传播

随着数字技术的不断发展和全球互联网的普及&#xff0c;在线教育和跨境电商在数字时代崭露头角&#xff0c;共同推动了知识的全球传播。 这两个领域的结合为学生、教育者和知识提供者创造了新的机遇和可能性&#xff0c;同时也带来了一系列有趣的挑战。本文将深入探讨在线教育…

【01】Istio-1.17 部署

1.1 部署Istio控制平面 部署方法 istioctl istio的专用管理工具&#xff0c;支持定制控制平面和数据平面通过命令行的选项支持完整的IstioOperator API命令行各选项可用于单独设置&#xff0c;以及接收包含IstioOperator自定义资源(CR)的yaml文件 Istio Operator Istio相关的自…

linux 安装 mini conda,linux下安装 Miniconda

下载地址 https://docs.conda.io/projects/miniconda/en/latest/index.html 安装conda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/mini…

数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

文章目录 数据结构上机实验1.要求2.图的实现&#xff08;以无向邻接表为例&#xff09;2.1创建图2.1.1定义图的顶点、边及类定义2.1.2创建无向图和查找2.1.3插入边2.1.4打印函数 2.2图的深度优先搜索&#xff08;DFS&#xff09;2.3图的广度优先搜索&#xff08;BFS&#xff09…

C/C++ #define与编译器的预处理

文章目录 预处理#define新版本特性旧版本特性#define除了定义明示常量的其他用途 #define的组成#define本身&#xff1a;预处理指令宏替换列表或替换体宏展开 参考资料 预处理 在预处理之前&#xff0c;编译器必须对该程序进行一些翻译处理。首先&#xff0c;编译器 把源代码中…

WampServer下载安装并结合内网穿透实现本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c;…

【Kettle实战】数据分批处理及参数化传递子作业任务

对于大表操作&#xff0c;本来离线数据需要分批处理&#xff0c;刚开始只会用具体日期去做&#xff0c;通过复制多分转换和作业来处理。当日期范围大了后&#xff0c;这是个苦力活儿&#xff0c;kettle里面有参数化传递功能&#xff0c;多动手实操&#xff0c;懂得灵活变通自然…

宝塔开心版hostcli的广告去除

首先感谢hostcli把宝塔7.6剥离了&#xff0c;直接安装我这里是缺少pyenv的包。 直接进入正题吧。 定位到页面左下方的广告位于 /www/server/panel/BTPanel/templates/default/layout.html “退出”按钮下方有条线开始去掉 去掉之前的忘了截图了&#xff0c;就这样吧&#xff…

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判…

日本it培训班,如何选择靠谱的赴日IT培训班?

随着科技的发展&#xff0c;信息技术行业在全球范围内迅速发展&#xff0c;并呈现出蓬勃的发展态势&#xff0c;在日本&#xff0c;IT行业也成为一种极为热门的职业选择。日本专门学校在这个领域内培养了许多IT从业者&#xff0c;成为了众多IT公司的培养基地。如果你对IT产业感…

【前端异常】JavaScript错误处理:分析 Uncaught(in promise) error

这里写目录标题 一、Promise是什么二、什么是 Uncaught(in promise) error三、解决方案3.1 使用catch方法处理Promise的错误3.2 使用 async/await 处理Promise的错误3.3 全局异常处理 四、结论 在开发过程中&#xff0c;JavaScript的错误处理是一个老生常谈的话题。当应用程序发…