藍橋杯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.pswp.cn/bicheng/74902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74902.shtml
英文地址,請注明出處:http://en.pswp.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…