蓝桥杯16天刷题计划一一Day01

蓝桥杯16天刷题计划一一Day01(STL练习)

作者:blue

时间:2025.3.26

文章目录

  • 蓝桥杯16天刷题计划一一Day01(STL练习)
    • [P1540 [NOIP 2010 提高组\] 机器翻译 - 洛谷 (luogu.com.cn)](https://www.luogu.com.cn/problem/P1540)
    • [P1996 约瑟夫问题 - 洛谷 (luogu.com.cn)](https://www.luogu.com.cn/problem/P1996)
    • [P1886 滑动窗口 /【模板】单调队列 - 洛谷 (luogu.com.cn)](https://www.luogu.com.cn/problem/P1886)
    • [P2947 [USACO09MAR\] Look Up S - 洛谷 (luogu.com.cn)](https://www.luogu.com.cn/problem/P2947)
    • [P1090 [NOIP 2004 提高组\] 合并果子 - 洛谷 (luogu.com.cn)](https://www.luogu.com.cn/problem/P1090)
    • [P2085 最小函数值 - 洛谷 (luogu.com.cn)](https://www.luogu.com.cn/problem/P2085)

对STL不熟悉的同学可以先看我对STL入门的一篇文章STL入门

[P1540 NOIP 2010 提高组] 机器翻译 - 洛谷 (luogu.com.cn)

这是一道很典型的队列题目,因为题目中很明显的说:“若内存中已存入 M 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。”非常符合队列先进先出的思想,所以我们可以用队列来模仿内存。

然后值得考虑的一个问题是:我们如何快速的判断当前这个单词是否在内存中呢?

如果遍历内存的话,时间的消耗是O(m)的,但我们注意到题目条件

“第二行为 N 个非负整数,按照文章的顺序,每个数(大小不超过 1000)代表一个英文单词。”

这说明最多也就只有1000个单词(单词都是以非负整数的形式表示),所以,我们可以使用Hash表来记录当前内存中单词是否存在,存在为1,不存在为0,这样我们维护内存时同时维护Hash表,这样就可以用O(1)的时间来判断单词是否在内存中了。

#include <iostream>
#include <queue>
using namespace std;
queue<int> mem; //队列模拟内存 
int Hash[1005]; //用于快速判断内存中是否存在单词 
int main()
{int m,n;int ans=0;int letter;//单词 cin>>m>>n;for(int i=1;i<=n;i++){cin>>letter;if(Hash[letter]==0){//内存中没有 ans++;//查字典mem.push(letter);Hash[letter]=1;//放入内存 //注意无论内存满没满,都要先放进队列里,然后再对内存做判断 if(mem.size()>m){//内存满了int temp=mem.front();Hash[temp]=0;mem.pop();//清空最早进入内存的单词  } } }cout<<ans; return 0;
}

P1996 约瑟夫问题 - 洛谷 (luogu.com.cn)

经典的约瑟夫环问题,在这里我们选择采用list来模拟这个过程,整个过程比较简单,主要要掌握list的增删与迭代器遍历的使用。

#include <iostream>
#include <list>
using namespace std;
list<int> circle;
int main()
{	int n,m;cin>>n>>m;for(int i=1;i<=n;i++) circle.push_back(i);//围成一圈 list<int>::iterator it = circle.begin();//迭代器 while(circle.size()>1){for(int i=1;i<m;i++){//模拟报数过程,注意这里自己也算个数,所以<m即可 it++;if(it==circle.end()) it=circle.begin();//到末尾了就重新去到头 } cout<<*it<<" ";list<int>::iterator next = ++it;//记录下一个将指向的位置 if(next==circle.end()) next=circle.begin();circle.erase(--it);//删除当前位置需要的数 it=next;}cout<<*it;return 0;
} 

P1886 滑动窗口 /【模板】单调队列 - 洛谷 (luogu.com.cn)

这题是利用单调队列解决滑动窗口的模板题。我们这里用双端队列(deque)来模拟滑动窗,双端队列的特点是可以从头出也可以从尾出。我们以维护窗口最小值的代码为例,来讲解一下维护的过程:

首先看队列是否为空,如果空的话,当前元素就可以入队(不过在这里我们在队列中存储下标即可,为什么呢?因为这样方便我们判断哪些数超出了窗口范围了),

如果队不空,就要做判断,如果当前队尾元素比当前i指向的元素小,那就保留,否则就要出队,给i指向的元素让位,在这种维护规则下,我们队列里的数据,从队头到队尾,就都是单调递增的,故而称之为单调队列,那谁是当前窗口最小的呢?显然是队头。

那么如何判断当前队头是不是在窗口内呢?因为i是窗口现在扫描到的最新的位置,k是窗口长度,所以窗口的首位置就应该是i-k+1,所以如果队头比i-k+1还小,那就肯定不在窗口内,直接从队头出队。

i=k时第一个窗口就填满了,故而i>=k时窗口总是满的,可以输出。

#include <iostream>
#include <queue>
using namespace std;
const int N=1e6+10;
int a[N];
deque<int> dq;//双端队列模拟滑动窗 
int main()
{	int n,k;cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];//维护最窗口最小值for(int i=1;i<=n;i++){while(!dq.empty()&&a[dq.back()]>a[i]) dq.pop_back();dq.push_back(i);while(dq.front()<i-k+1) dq.pop_front();if(i>=k) cout<<a[dq.front()]<<" ";//窗口已经满了,可以输出} cout<<endl;dq.clear();//清空队列 //维护窗口最大值for(int i=1;i<=n;i++){while(!dq.empty()&&a[dq.back()]<a[i]) dq.pop_back();dq.push_back(i);while(dq.front()<i-k+1) dq.pop_front();if(i>=k) cout<<a[dq.front()]<<" ";//窗口已经满了} return 0;	
} 

[P2947 USACO09MAR] Look Up S - 洛谷 (luogu.com.cn)

本题是单调栈经典题目

单调栈的应用场景:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。

感觉单调栈的想法和单调队列的很像,题目要求向右看齐,即找任意一个元素的右边第一个比自己大的元素,这时我们就可以利用单调栈。

首先,找右边比自己大的就倒序遍历数据,在栈不空的情况下,如果当前元素大于栈顶元素,那么栈顶元素就不是其仰望的对象,故栈顶元素出栈,直到栈顶元素比当前元素大了,那此时栈顶元素即为当前元素右边最近的仰望对象,这样我们维护出来的栈从栈顶到栈底总是单调递增的,故而称为单调栈。请读者自己模拟一遍这个过程,就会非常清楚,单调栈在其中的应用。

#include <iostream>
#include <stack>
using namespace std;
const int N=1e5+10;
int h[N];//存储奶牛们的身高 
int ans[N];//存放答案
stack<int> st;//单调栈 
int main()
{int n;cin>>n;for(int i=1;i<=n;i++) cin>>h[i];for(int i=n;i>=1;i--){//因为是向右看齐,所以我们倒序遍历 //注意是找最近的仰望对象,所以等于的也要出栈 while(!st.empty()&&h[i]>=h[st.top()]) st.pop();if(st.empty()) ans[i]=0;//栈空,证明没有仰望对象了else ans[i]=st.top();//栈不空,说明现在栈顶是它的仰望对象 st.push(i);//入栈,存的是下标} for(int i=1;i<=n;i++) cout<<ans[i]<<endl; return 0; 
}

[P1090 NOIP 2004 提高组] 合并果子 - 洛谷 (luogu.com.cn)

本题是优先队列的经典应用。

题目要求我们找出能将所有堆果子合并为一堆果子,并且要求体力值最小。读完题目我们不难发现,最佳的方案其实就是每次选取两堆最小数目的果子进行合并,那我们如何找到两堆最小的果子呢,第一个想法是排序,但是每次都要排序实在是太过麻烦,而且每次合并后又会产生新的一堆果子,所以如果有这么一个数据结构,我每次放数据进去就会自动排序就好了。

诶!还真有,优先队列可以做到,它可以进行自动排序,对于这道题,我们设置一个小顶堆,每次找两个最小数量的果子,就是取两次堆顶,然后合并后放回堆中,直到堆里只有一个元素,就是剩一堆的时候,就结束。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{int n,x;int ans=0;priority_queue<int,vector<int>,greater<int> > q;//小顶堆 cin>>n;while(n--)//输入 {cin>>x;q.push(x); } while(q.size()!=1)//当只剩下一堆果子时循环结束 {int a=q.top(); //从堆顶取出最小的两堆合并 q.pop();int b=q.top();q.pop();ans+=a+b;q.push(a+b);}cout<<ans;return 0;
}

P2085 最小函数值 - 洛谷 (luogu.com.cn)

优先队列太重要了,我们再练习一道有关优先队列结构体排序的题目。

这道题的意思其实就是给你N条带A,B,C参数的式子,然后让你不断变化变量x(从1开始,每次自增1),然后找出m个最小的值。

所以最主要的地方还是在找最小,我们可以这样做,设计一个node结构体来存储式子的ABC参数,和变量X与函数值Y,然后创建一个节点类型为node类型的优先队列(所以我们要掌握,结构体优先队列怎么控制小顶堆),然后我们每次取堆顶,因为堆顶是最小的,然后取出来之后自增变量x,然后更新y,重新放回堆里。然后重复这个过程。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef struct node{ int a;int b;int c;int x;int y;//函数值 
}node;
bool operator <(const node &a,const node &b){return a.y>b.y;//最小值优先 
} 
int fun(node p){return p.a*p.x*p.x+p.b*p.x+p.c;
}
const int N=1e4+5;
node a[N];
int main()
{int n,m; vector<int> ans;priority_queue<node> que;//找最小函数值 cin>>n>>m;for(int i=0;i<n;i++){cin>>a[i].a>>a[i].b>>a[i].c;a[i].x=1;a[i].y=fun(a[i]);que.push(a[i]);}while(ans.size()<m){node temp=que.top();que.pop();ans.push_back(temp.y);temp.x++;temp.y=fun(temp);que.push(temp);}for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";return 0;
}

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

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

相关文章

相对位置2d矩阵和kron运算的思考

文章目录 1. 相对位置矩阵2d2. kron运算 1. 相对位置矩阵2d 在swin-transformer中&#xff0c;我们会计算每个patch之间的相对位置&#xff0c;那么我们看到有一连串的拉伸和相减&#xff0c;直接贴代码&#xff1a; import torch import torch.nn as nntorch.set_printoptio…

Redis 版本演进及主要新特性

Redis 版本发布历史 稳定版本时间线 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新稳定版(截至…

HTML5 Geolocation(地理定位)学习笔记

一、HTML5 Geolocation简介 HTML5 Geolocation&#xff08;地理定位&#xff09;API用于获取用户的地理位置信息。通过这个API&#xff0c;可以获取用户的纬度、经度、海拔等信息。由于地理定位可能涉及用户隐私&#xff0c;因此只有在用户同意的情况下&#xff0c;才能获取其…

爱普生VG3225EFN压控晶振5G基站低噪声的解决方案

在 5G 通信网络的高速发展中&#xff0c;系统噪声的控制成为保障网络可靠性与数据吞吐量的关键。爱普生 VG3225EFN 压控晶振凭借其卓越的低噪声特性&#xff0c;成为 5G 基站时钟系统的理想选择。通过创新的技术设计&#xff0c;这款晶振不仅为基站提供了稳定的时钟基准&#x…

【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#

问题描述 在Linux安装conda下的python环境时候&#xff0c;修改了~/.bashrc文件&#xff0c;修改完成后&#xff0c;再次进入服务器后&#xff0c;登录时候显示的不是正常的[rootlocalhost ~]#&#xff0c;而是-bash-4.2# 原因分析&#xff1a; 网上原因有&#xff1a;/root下…

机器学习knnlearn5

import numpy as np from os import listdir from sklearn.neighbors import KNeighborsClassifier as kNN# 此函数用于将一个32x32的文本文件转换为一个1x1024的一维向量 def img2vector(filename):"""将32x32的文本文件转换为1x1024的向量:param filename: 要…

git revert 用法实战:撤销一个 commit 或 merge

git revert 1 区别 • 常规的 commit &#xff08;使用 git commit 提交的 commit&#xff09; • merge commit 2 首先构建场景 master上的代码 dev开发分支上&#xff0c;添加一个a标签&#xff0c;并commit这次提交 切到master上&#xff0c;再次进行改动和提交 将de…

自然语言处理|高效法律助手:AI如何解析合同条款?

引言&#xff1a;法律 AI 的崛起 在数字化浪潮快速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一个陌生的概念&#xff0c;它正以快速发展渗透到各个领域&#xff0c;法律行业也不例外。从智能合同审查到法律风险预测&#xff0c;AI 技术为法律工作带来…

【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年最大值&#xff01;另外&#xff0c;我们基于此年度栅格数据按照行政区划取平均值&#xff0c;得到…

办公网络健康监控(域名健康监控)

需求 办公室访问一些网络经常出现故障 现需要时时观察监控这些网络的健康 包含专线网等其他网络 实施 支持 SNMP 且支持 Webhook 发送报警的开源监控系统 hertzbeat:关系型数据库+时序数据库; Zabbix:关系型数据库; LibreNMS:关系型数据库; Prometheus(包含ale…

蓝桥杯 合并数列

问题描述 小明发现有很多方案可以把一个很大的正整数拆成若干个正整数的和。他采用了其中两种方案&#xff0c;分别将它们列为两个数组&#xff1a; {a₁, a₂, ..., aₙ}{b₁, b₂, ..., bₘ} 两个数组的元素和相同。 定义一次合并操作为&#xff1a;将某个数组中相邻的两…

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

个人学习编程(3-29) leetcode刷题

最后一个单词的长度&#xff1a; 思路&#xff1a;跳过末尾的空格&#xff0c;可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度&#xff0c; int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…

PAT甲级(Advanced Level) Practice 1028 List Sorting

原题 1028 List Sorting - PAT (Advanced Level) Practice 题目大意 输入n个学生的id、姓名、分数&#xff0c;再输入C表示对C列进行排序。 id&#xff1a;从小到大排 姓名&#xff1a;姓名不同时从小到大排&#xff0c;相同时id从小到大排 分数&#xff1a;不同时从小到…

UE4学习笔记 FPS游戏制作20 重写机器人和玩家死亡 切换相机和模型

定义父类中的死亡方法 在父类中定义OnDie方法&#xff0c;不需要实现&#xff0c;由子类实现各自的死亡逻辑 新建一个Die方法&#xff0c;处理公共的死亡逻辑 Die的实现&#xff1a; 以前的分离控制现在要延迟做&#xff0c;如果分离了控制器&#xff0c;就无法再获取到玩家的…

Linux信号的诞生与归宿:内核如何管理信号的生成、阻塞和递达?

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 一、认识信号 二、信号的产生 1.键盘输入 2.系统调用 3.系统指令 4.硬件异常 5.软件条件 三、信号的保存 1.block 2.pending 3.handler 四、信号…

DeepSeek API集成开发指南——Flask示例实践

DeepSeek API集成开发指南——Flask示例实践 序言&#xff1a;智能化开发新范式 DeepSeek API提供了覆盖自然语言处理、代码生成等多领域的先进AI能力。本文将以一个功能完备的Flask示例系统为载体&#xff0c;详解API的集成方法与最佳实践。通过本案例&#xff0c;开发者可快…

Linux环境下安装部署Docker

windows下连接Linux&#xff1a; 打开终端&#xff1a; //ssh远程连接 ssh root192.168.xx.xx//输入账号密码 root192.168.xx.xxs password: ssh连接成功&#xff01; 安装Docker&#xff1a; //安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …

开源CDN产品-GoEdge

一、背景 上篇文章分析了一下CDN的基本原理以及使用代码实现了一个乞丐版的智能DNS调度器。从整个例子我们可以清晰了解到CDN原理&#xff0c;也就那么回事。 但是&#xff0c;之前也讲过了&#xff0c;CDN产品融合的技术比较杂、也比较多。所以我就想着&#xff0c;万物皆有开…

正则表达式-万能表达式

1、正则 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找 出满足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相关的文章&#xff1a; https://www.cnblogs.com/Simple-S…