2024蓝桥杯每日一题(单调队列)

news2024/9/29 11:42:23

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:单调栈
        试题二:滑动窗口
        试题三:子矩阵
        试题四:最大子序和


试题一:单调栈

【题目描述】

        给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1−1。

【输入格式】

        第一行包含整数 N,表示数列长度。

        第二行包含 N 个整数,表示整数数列。

【输出格式】

        共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。

【数据范围】

        1≤N≤105
        1≤数列中元素≤109

【输入样例】

5
3 4 2 7 5

【输出样例】

-1 3 -1 2 2

【解题思路】

        模板题

【Python程序代码】

from collections import *
n = int(input())
a = list(map(int,input().split()))
q,idx = [0]*(n+5),-1
for i in range(n):
    if idx>=0:
        while idx>=0 and q[idx]>=a[i]:idx-=1
        if idx<0:
            print(-1,end=' ')
        else:
            print(q[idx],end=' ')
    else:
        print(-1,end=' ')
    idx += 1
    q[idx] = a[i]



试题二:滑动窗口

【题目描述】

        给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。

        你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。 

【输入格式】

        输入包含两行。

        第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。

        第二行有 n个整数,代表数组的具体数值。

        同行数据之间用空格隔开。

【输出格式】

        输出包含两个。

        第一行输出,从左至右,每个位置滑动窗口中的最小值。

        第二行输出,从左至右,每个位置滑动窗口中的最大值。

【输入样例】

8 3
1 3 -1 -3 5 3 6 7

【输出样例】

-1 -3 -3 -3 3 3
3 3 5 5 6 7

【解题思路】

        单调队列模板题

【Python程序代码】

from collections import *
n,k = map(int,input().split())
a = [0] + list(map(int,input().split()))
q = deque()
for i in range(1,n+1):
    if len(q) and q[0]<i-k+1:q.popleft()
    while q and a[i]<a[q[-1]]:q.pop()
    q.append(i)
    if i>=k-1:print(a[q[0]],end=' ')
print()
q = deque()
for i in range(1,n+1):
    if len(q) and q[0]<i-k+1:q.popleft()
    while q and a[i]>a[q[-1]]:q.pop()
    q.append(i)
    if i>=k-1:print(a[q[0]],end=' ')


试题三:子矩阵

【题目描述】

        给定一个 n×m(n 行 m列)的矩阵。设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为 a×b (a 行 b 列)的子矩阵的价值的和。答案可能很大,你只需要输出答案对 998244353 取模后的结果。

【输入格式】

        输入的第一行包含四个整数分别表示 n,m,a,b相邻整数之间使用一个空格分隔。

        接下来 n 行每行包含 m 个整数,相邻整数之间使用一个空格分隔,表示矩阵中的每个数 Ai,j。

【输出格式】

        输出一行包含一个整数表示答案。

【数据范围】

        对于 40%40% 的评测用例,1≤n,m≤100;
        对于 70%70% 的评测用例,1≤n,m≤500;
        对于所有评测用例,1≤a≤n≤1000,1≤b≤m≤1000,1≤Ai,j≤109。

【输入样例】

2 3 1 2
1 2 3
4 5 6

【输出样例】

58

【解题思路】

        对行和列分别用单调队列

【Python程序代码】

from collections import *
n,m,a,b = map(int,input().split())
mp,p = [],998244353
for i in range(n):
    mp.append(list(map(int,input().split())))
max_arr = [[] for _ in range(n)]
min_arr = [[] for _ in range(n)]
# 对行变换
for i in range(n):
    q = deque()
    num = mp[i]
    for j in range(m):
        if q and q[0]<j-b+1:q.popleft()
        while q and num[q[-1]]<num[j]:q.pop()
        q.append(j)
        if j>=b-1:max_arr[i].append(num[q[0]])
    q = deque()
    num = mp[i]
    for j in range(m):
        if q and q[0]<j-b+1:q.popleft()
        while q and num[q[-1]]>num[j]:q.pop()
        q.append(j)
        if j>=b-1:min_arr[i].append(num[q[0]])
max_fin,min_fin = [[] for _ in range(n)],[[] for _ in range(n)]
for i in range(len(max_arr[0])):
    q = deque()
    for j in range(len(max_arr)):
        if q and q[0]<j-a+1:q.popleft()
        while q and max_arr[q[-1]][i]<max_arr[j][i]: q.pop()
        q.append(j)
        if j>=a-1:max_fin[j].append(max_arr[q[0]][i])
    q = deque()
    for j in range(len(max_arr)):
        if q and q[0] < j - a + 1: q.popleft()
        while q and min_arr[q[-1]][i] > min_arr[j][i]: q.pop()
        q.append(j)
        if j >= a - 1: min_fin[j].append(min_arr[q[0]][i])
res = 0
for i in range(len(max_fin)):
    for j in range(len(min_fin[i])):
        res = (res + max_fin[i][j] * min_fin[i][j])%p
print(res)

试题四:最大子序和

【题目描述】

        输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。

        注意: 子序列的长度至少是 11。

【输入格式】

        第一行输入两个整数 n,m。

        第二行输入 n 个数,代表长度为 n 的整数序列。

        同一行数之间用空格隔开。

【输出格式】

        输出一个整数,代表该序列的最大子序和。

【数据范围】

        1≤n,m≤300000,
        保证所有输入和最终结果都在 int 范围内。

【输入样例】

6 4
1 -3 5 1 -2 3

【输出样例】

7

【解题思路】

        单调队列用一下,首先初始ans应该是数组中最大的一个,其他的情况可以用前缀和+单调队列。

【Python程序代码】

from collections import *
n,m = map(int,input().split())
a = [0] + list(map(int,input().split()))
res = max(a[1:])
for i in range(1,n+1):a[i]+=a[i-1]
q = deque()
q.append(0)
for i in range(1,n):
    if q and i-q[0]+1>m:q.popleft()
    while q and a[i]<a[q[-1]]:q.pop()
    q.append(i)
    if i>1:res = max([res,a[i+1]-a[q[0]]])
print(res)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怿星科技Neptune CHT-S测试系统,让智能座舱测试更加高效便捷

随着汽车“智能化”浪潮的推进&#xff0c;汽车的智能化水平正在持续刷新行业认知。在这股智能化潮流中&#xff0c;智能座舱作为客户体验最为直观的部分&#xff0c;其重要性不言而喻。倘若座舱设备出现死机、黑屏、卡顿等现象&#xff0c;都将对客户的使用体验产生非常大的影…

Python Flask 表单的使用

新建templ;ates/index.html 内容如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"">账号&#xff1a;<input …

Flutter Widget:StatefulWidgetStatelessWidgetState

Widget 概念 Widget 将是构建Flutter应用的基石&#xff0c;在Flutter开发中几乎所有的对象都是一个 Widget 。 在Flutter中的widget 不仅表示UI元素&#xff0c;也表示一些功能性的组件&#xff0c;如&#xff1a;手势 、主题Theme 等。而原生开发中的控件通常只是指UI元素。…

[Rust] 使用vscode实现HelloWorld程序并进行debug

一、简介 本文介绍了如何使用vscode编写rust&#xff0c;实现打印"Hello, world!"的程序。 二、工具安装 0. 环境介绍&#xff1a; Linux &#xff08;或者windowswsl&#xff09; 1. 安装rust编译器rustc和包管理器cargo。 请参考连接&#xff1a;Rust 程序设…

Skywalking的Helm Chart方式部署

背景 之前介绍了AWS云上面的EKS的集中日志方案。这次主要介绍调用链监控了&#xff0c;这里我们用的是Skywalking。监控三王者&#xff08;EFKPrometheusSkywalking&#xff09;之一。之前AWS云上面使用fluent bit替代EFK方案&#xff0c;其实&#xff0c;AWS云在调用链方面&a…

1Panel应用推荐:DataEase开源数据可视化分析工具

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

查看Scala类的方法

文章目录 一、概述如何查看Scala类的方法二、使用Scala文档查看类的方法三、使用反射机制查看类的方法 一、概述如何查看Scala类的方法 本文介绍了在Scala中查看Int类方法的两种方法&#xff1a;使用Scala标准库文档和使用反射机制。通过Scala标准库文档&#xff0c;您可以方便…

Qt 项目使用visual studio 进行开发调试

https://marketplace.visualstudio.com/items?itemNameTheQtCompany.QtVisualStudioTools2015 https://devblogs.microsoft.com/cppblog/bring-your-existing-qt-projects-to-visual-studio/ 正常Qt开发中&#xff0c;使用Qt Creator 进行windows下MSVC编译器的调试是一件挺麻…

jenkins构建完成后部署到本机,无法读取容器外文件夹

项目背景&#xff1a; Dockerjenkins 构建完成后&#xff0c;要把打包的dist文件夹内容移动到网站目录 /www/wwwroot/xxxxxx 文件夹下&#xff1b;但是获取不到jenkins容器外的文件夹。 解决办法&#xff1a; 在容器中&#xff0c;添加挂载/映射本机目录&#xff0c;把网站…

【C语言_数组_复习篇】

目录 一、数组的概念 二、数组的类型 三、一维数组 3.1 一维数组的创建 3.2 一维数组的初始化 3.3 一维数组的访问 3.4 一维数组在内存中的存储 四、二维数组 4.1 二维数组的创建 4.2 二维数组的初始化 4.3 二维数组的访问 4.4 二维数组在内存中的存储 五、变长数组 六、…

大数据主要组件HDFS Iceberg Hadoop spark介绍

HDFSIceberghadoopspark HDFS 面向PB级数据存储的分布式文件系统&#xff0c;可以存储任意类型与格式的数据文件&#xff0c;包括结构化的数据以及非结构化的数据。HDFS将导入的大数据文件切割成小数据块&#xff0c;均匀分布到服务器集群中的各个节点&#xff0c;并且每个数据…

R语言:vagen包做微生物香农指数分析,ggplot2画箱线图

> setwd("目录路径") > library(vegan) > library(picante) > library(openxlsx) > library(ggplot2) > library(ggsci) > otu <- read.xlsx("OTU.xlsx",rowNames T) > head(otu)T1 T2 T3 T5 T6 T8 T9 N…

瑞_23种设计模式_状态模式

文章目录 1 状态模式&#xff08;State Pattern&#xff09;1.1 介绍1.2 概述1.3 状态模式的结构1.4 状态模式的优缺点1.5 状态模式的使用场景 2 案例一2.1 需求2.2 代码实现&#xff08;未使用状态模式&#xff09;2.3 代码实现&#xff08;状态模式&#xff09; 3 案例二3.1 …

基于python+vue网络相册设计与实现flask-django-nodejs-php

网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0…

递归的个人总结

递归函数&#xff08;递去、回归&#xff09;是函数不断的调用自己&#xff1b; 可以按照如下来理解&#xff1a;func1中调用func2&#xff0c;func2中调用func3; func3函数返回了&#xff0c;继续执行func2中的语句&#xff1b;func2执行完了&#xff0c;继续执行func1之后的…

备考ICA----Istio实验6---流量镜像 Traffic Mirroring 实验

备考ICA----Istio实验6—流量镜像 Traffic Mirroring 实验 流量镜像功能可以将生产的流量镜像拷贝到测试集群或者新的测试版本中&#xff0c;在不影响实际生产环境的情况下&#xff0c;测试具有实际生产流量的服务&#xff0c;帮助减低版本变更的风险。也可以用在不同集群间的…

定制 Elasticsearch 镜像

安装ik分词器 下载ik分词器 下载地址&#xff1a;https://github.com/infinilabs/analysis-ik/releases Dockerfile FROM docker.elastic.co/elasticsearch/elasticsearch:8.12.2 COPY ./elasticsearch-analysis-ik-8.12.2.zip /opt/ RUN bin/elasticsearch-plugin instal…

如何在 Odoo 17 的 齿轮菜单⚙️ 中添加新菜单

在 Odoo 中&#xff0c;齿轮菜单是一个重要组件&#xff0c;允许用户访问与系统内不同模型和功能相关的各种配置选项和设置。它通常由位于用户界面左上角的齿轮或齿轮图标表示。下图显示了 "sale.order "模型的齿轮菜单。 默认情况下&#xff0c;我们在 CogMenu 中提…

当我想用ChatGPT-Next-Web来套壳Azure OpenAI Service时

使用Cloudflare worker来代理Azure OpenAI API&#xff0c; 并将其转换为兼容OpenAI的API 一直没能搞定OpenAI的订阅&#xff0c; 就因为没有搞定国外的信用卡&#xff0c; 所以就一直使用GPT-3.5来处理日常的文字生成工作&#xff0c; 例如写文档&#xff0c; 生成一些简单的脚…

前言:为什么C语言最适合编程入门?

前言&#xff1a;为什么C语言最适合编程入门&#xff1f; C语言被认为最适合编程入门的原因主要有以下几点&#xff1a; 基础且强大&#xff1a;C语言是一种基础且强大的编程语言。它提供了对底层硬件的直接访问&#xff0c;让初学者能够更好地理解计算机的工作原理&#xff0…