第十四屆藍橋杯省賽真題解析(含C++詳細源碼)

第十四屆藍橋杯省賽

  • 整數刪除
    • 滿分思路及代碼
      • solution1 (40% 雙指針暴力枚舉)
      • solution 2(優先隊列+模擬鏈表 AC)
  • 冶煉金屬
    • 滿分代碼及思路
  • 子串簡寫
    • 滿分思路及代碼
      • solution 1(60% 雙指針)
      • solution 2(二分 AC)
  • 島嶼個數
    • 滿分代碼及思路
  • 飛機降落
    • 滿分思路及代碼
  • 接龍數列
    • 滿分思路及代碼

整數刪除

在這里插入圖片描述
題目鏈接

滿分思路及代碼

solution1 (40% 雙指針暴力枚舉)

#include <iostream>
using namespace std;
const int N=5e5+10;
int n,k;
int a[N];
int main()
{cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}//實際上我們并不能通過簡單的排序來找到數列中最小的整數//因為這樣會失去原來的相對位置 而導致刪去后的增加操作出錯//所以我們可以用雙指針的思路來寫while(k--){int l=1;int r=n;while(l!=r){if(a[l]<=a[r]){r--;}else{l++;}}//遍歷整個數組尋找最小值if(l==1){a[l+1]+=a[l];}else if(l==n){a[l-1]+=a[l];}else{a[l+1]+=a[l];a[l-1]+=a[l];}//刪除 覆蓋掉for(int i=l;i<=n;i++){a[i]=a[i+1];}n--;
}for(int i=1;i<=n;i++){cout<<a[i]<<' ';}return 0;
}

solution 2(優先隊列+模擬鏈表 AC)

思路參考:
在這里插入圖片描述

#include <bits/stdc++.h>
using namespace std;
// 記錄每個位置的數是否被刪除過
bool removed[500005];
// 數據過大,爆int
#define ll long long
int main()
{int n, k;cin >> n >> k;// 數列,數和左右相鄰的數的距離vector<pair<ll, pair<int, int>>> a(n);// 優先隊列,數和下標priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> p;int t;for (int i = 0; i < n; i++){cin >> t;// 相鄰的數初始距離為1a[i] = {t, {1, 1}};// 數和下標壓入堆p.push({t, i});}//查找k次while (k){// 彈出第一個數pair<ll, int> tp = p.top();p.pop();ll value = tp.first;int index = tp.second;// 如果已經被刪除過,或者被修改過,則跳過,否則刪除if (removed[index] || a[index].first != value)continue;// 標記為已刪除removed[index] = true;// 左右最近未被刪除節點到自己的距離int l = index - a[index].second.first;int r = index + a[index].second.second;// 如果左邊相鄰的數存在則更新if (l >= 0 && !removed[l]){// 更新左邊的數并壓入堆a[l].first += value;p.push({a[l].first, l});// 如果右邊的數存在,則更新左邊的數到右邊的距離if (r < n && !removed[r]){a[l].second.second += a[index].second.second;}}// 如果右邊相鄰的數存在則更新if (r < n && !removed[r]){// 更新右邊的數并壓入堆a[r].first += value;p.push({a[r].first, r});// 如果左邊的數存在,則更新右邊的數到左邊的距離if (l >= 0 && !removed[l]){a[r].second.first += a[index].second.first;}}k--;}// 輸出還未被刪除的數for (int i = 0; i < n; i++){if (!removed[i])cout << a[i].first << " ";}return 0;
}

冶煉金屬

在這里插入圖片描述

滿分代碼及思路

//對于這個v的范圍我們怎么來確定呢
//我覺得是這樣的 例如投入75個O產出3個X
//如果最好的情況即浪費的最少得時候 即V=25 當然也有小數的情況 但也就是直接相除之后向下取整就好 最后對于每一次冶煉的V取max
//最壞的情況需要考慮 還是拿上面的舉例 我們可以從產出4個X所需要的V枚舉到3 最后取min 但是注意此時就需要向上取整即加1;
//因為我們是在找不符合75個出3個X的臨界點 即多少O出4個X

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int a[N],b[N];
int n;
int maxval=1e9;
int minval=0;
int main()
{cin>> n;for(int i=0;i<n;i++){cin>>a[i]>>b[i];}for(int i=0;i<n;i++){maxval=min(a[i]/b[i],maxval);minval=max(a[i]/(b[i]+1)+1,minval);}cout<<minval<<' '<<maxval;return 0;
}

子串簡寫

在這里插入圖片描述

題目鏈接

滿分思路及代碼

solution 1(60% 雙指針)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>using namespace std;// 雙指針方法
int TwoPointers(int K, const string& S, char c1, char c2) {int n = S.length();int count = 0;for (int left = 0; left < n; ++left) {if (S[left] == c1) {for (int right = left + K - 1; right < n; ++right) {if (S[right] == c2) {++count;}}}}return count;
}
//首先暴力的思路類似于雙指針 
//三種情況
//我們用p指針找到C1 保持c1不動移動指針q 讓q不斷去找c2 直到滿足我們的長度我們的res++
//然后q走到最后一個c2了之后移動p 規則一樣
//p q一起動
//
int main() {int K;string S;char c1, c2;// 讀取輸入cin >> K;cin >> S >> c1 >> c2;// 計算結果int result=TwoPointers(K, S, c1, c2);cout << result << endl;return 0;
}

solution 2(二分 AC)

#include<iostream>
#include<algorithm>
using namespace std;
int nec1[500100];
int c1dx = 0;
int c2dx = 0;
int nec2[500100];
int main()
{int k;cin >> k;string str;cin >> str;str = "1" + str;char c1, c2;cin >> c1 >> c2;for (int i = 1; i < str.length(); i++) {//記錄c1字符所有出現的位置if (str[i] == c1) {nec1[c1dx] = i;c1dx++;}//記錄c2字符所有出現位置if (str[i] == c2) {nec2[c2dx] = i;c2dx++;}}long long ans = 0;//枚舉c1字符出現的位置for (int i = 0; i < c1dx; i++) {//二分查找c2字符出現的位置的合法位置auto dx = lower_bound(nec2, nec2 + c2dx, nec1[i] + k-1);//沒有找到情況if (dx == nec2 + c2dx)continue;//找到了int t = dx - nec2;//加上總合法個數ans += c2dx - t;}cout << ans << endl;return 0;
}

島嶼個數

在這里插入圖片描述

題目鏈接

滿分代碼及思路

在我之前的文章 搜索系列 里面可以找到詳細分析

#include <bits/stdc++.h> 
using namespace std;
const int X = 50 + 10;
typedef pair<int, int> PII;
int grid[X][X];  // 使用 int 類型數組
int n, m, T;
int ans;
int s[X];
// 海的移動偏移量數組
int dx[8] = {-1,-1,-1,0,1,1,1,0};
int dy[8] = {-1,0,1,1,1,0,-1,-1};
// 陸地的移動偏移量
int DX[4] = {-1, 0, 1, 0};
int DY[4] = {0, 1, 0, -1};
bool st_land[X][X];
bool st_sea[X][X];bool check(int x, int y) {if (x < n && x >= 0 && y < m && y >= 0) {return true;}return false;
}// 找到了(x,y)所在的島嶼 并將該島嶼的所有點都標為了 true
void bfs_land(int u, int v) {queue<PII> Q;st_land[u][v] = true;PII tp = {u, v};Q.push(tp);while (!Q.empty()) {PII t = Q.front();Q.pop();for (int i = 0; i < 4; i++) {int nu = t.first + DX[i];int nv = t.second + DY[i];if (check(nu, nv) && grid[nu][nv] == 1 && !st_land[nu][nv]) {st_land[nu][nv] = true;Q.push({nu, nv});}}}
}void bfs_sea(int x, int y) {queue<PII> q;PII tmp = {x, y};q.push(tmp);st_sea[x][y] = true;while (!q.empty()) {PII p = q.front();q.pop();for (int i = 0; i < 8; i++) {  // 枚舉一下海的方向  int nx = p.first + dx[i];int ny = p.second + dy[i];if (!check(nx, ny) || st_sea[nx][ny]) {continue;}if (grid[nx][ny] == 0) {st_sea[nx][ny] = true;q.push({nx, ny});} else if (grid[nx][ny] == 1 && !st_land[nx][ny]) {ans++;bfs_land(nx, ny);  // 如果發現尋找外海的過程中發現了陸地 說明屬于新的外島那么需要找到與他相連的全部陸地}}}
}int main() {cin >> T;while (T--) {cin >> n >> m;ans = 0;  // 每次都需要重置一下for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {st_sea[i][j] = st_land[i][j] = false;}}for (int i = 0; i < n; i++) {string s;cin >> s;for (int j = 0; j < m; j++) {grid[i][j] = s[j] - '0';  // 將字符轉化成數字存進去}}bool has_sea = false;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {if (!st_sea[i][j] && grid[i][j] == 0) {  // 當前的這個點是海并且是沒有被標記過has_sea = true;bfs_sea(i, j);}}}}// 判斷全是陸地的特例(只有一個大島)if (!has_sea) {ans = 1;}cout << ans << endl;}return 0;
}

飛機降落

在這里插入圖片描述
題目鏈接

滿分思路及代碼

思路直接去看我之前的文章就好:搜索系列
非常詳細具體
視頻講解:非常牛逼

#include <bits/stdc++.h>
using namespace std;
const int N =10+9;//防止越界
int n;//有多少架飛機
//int T,D,L;//分別表示降落時刻,能盤旋的時間,降落的時間
//考慮到這題這三個數據可以代表一架飛機的屬性 可以考慮采用結構體來實現struct plane{
int t;
int d;
int l;
}p[N];
bool s[N];//每架飛機的狀態
//我們需要知道幾架飛機成功降落 和前一架飛機降落的時間
bool dfs(int x,int time)
{if(x>=n){return true;}//遞歸出口//枚舉每種降落順序for(int i=0;i<n;i++){if(!s[i])//這架飛機沒有安排過{s[i]=true;if(p[i].t+p[i].d<time)//燃盡了也沒等到前一架飛機降落完畢{//回溯s[i]=false;return false;}int next=max(p[i].t,time)+p[i].l;//核心 兩種情況的綜合//即一來就可以落 和 需要等前一架降落完畢再落if(dfs(x+1,next)){return true;//后續的飛機都可以順利降落}s[i]=false;}}return false;//所有降落方案都不能成功降落;}
int main()
{int T;//測試的組數cin>>T;while(T--){cin>>n;for(int i=0;i<n;i++){cin>>p[i].t>>p[i].d>>p[i].l;}if(dfs(0,0)){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}for(int i=0;i<n;i++){s[i]=false;}}return 0;}

接龍數列

在這里插入圖片描述

題目鏈接

滿分思路及代碼

其實我們需要轉化題目所問的問題
題目問的是 最少需要刪除幾個字符或者說數字 等價于求數列最長是多少 ——最長子序列問題
思路參考:視頻講解

#include <iostream>
using namespace std;
const int N = 1e5;
int a[N]; //也可以使用vector,但在效率上會有損失
int dp[10];//全局變量,全部默認初始化為0
int main()
{
int n;
cin >> n;
for (int i = 0;i < n;i++)
{
cin >> a[i];
}
//拆分每一個數,取出首位數字和末位數字
int front, tail;
for (int i = 0;i < n;i++)
{
int cur = a[i];
tail =cur % 10;
front =tail;
while (cur)
{
front = cur%10;
cur= cur / 10;
}
dp[tail] = dp[tail] > dp[front] + 1 ? dp[tail] : dp[front ]+ 1;
}
//找最大的dp數組元素值
int maxLen = 0;
for (int i = 0;i < 10;i++)
{
if (dp[i] > maxLen)
maxLen = dp[i];
}
cout << n - maxLen << endl;
return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900417.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI Agent開發大全第二十一課-如何開發一個MCP(從0開發一個MCP Client)

開篇 上一章《AI Agent開發大全第二十課-如何開發一個MCP(從0開發一個MCP Server)》里我們講了如何從0開始開發一個MCP Server。可以看到文中大量細節為MCP發明者官網Claude都不曾或者是遺漏的,而且還有那么多點遺漏,想要真正要在企業生產級環境使用MCP是需要做分布式開發的…

TypeScript面試題集合【初級、中級、高級】

初級面試題 什么是TypeScript&#xff1f; TypeScript是JavaScript的超集&#xff0c;由Microsoft開發&#xff0c;它添加了可選的靜態類型和基于類的面向對象編程。TypeScript旨在解決JavaScript的某些局限性&#xff0c;比如缺乏靜態類型和基于類的面向對象編程&#xff0c…

無錫無人機駕駛證培訓費用

無錫無人機駕駛證培訓費用&#xff0c;隨著科技的迅速發展&#xff0c;無人機在眾多行業中發揮著舉足輕重的作用。從影視制作到農業監測&#xff0c;再到物流運輸與城市規劃&#xff0c;無人機的應用場景不斷擴展&#xff0c;因此越來越多的人開始意識到學習無人機駕駛技能的重…

2181、合并零之間的節點

2181、[中等] 合并零之間的節點 1、問題描述&#xff1a; 給你一個鏈表的頭節點 head &#xff0c;該鏈表包含由 0 分隔開的一連串整數。鏈表的 開端 和 末尾 的節點都滿足 Node.val 0 。 對于每兩個相鄰的 0 &#xff0c;請你將它們之間的所有節點合并成一個節點&#xff…

相機的曝光和增益

文章目錄 曝光增益增益原理主要作用增益帶來的影響增益設置與應用 曝光 參考&#xff1a;B站優致譜視覺 增益 相機增益是指相機在拍攝過程中對圖像信號進行放大的一種操作&#xff0c;它在提高圖像亮度和增強圖像細節方面起著重要作用&#xff0c;以下從原理、作用、影響以…

小飛電視 2.7.0 | 高清秒播無卡頓的電視直播軟件

小飛電視采用了流行的天光YY殼進行二次開發&#xff0c;內置了熱門的肥羊源。更新后在加載速度和播放速度上有了顯著提升&#xff0c;并提供了豐富的內容和各種分類欄目&#xff0c;包括4K和8K頻道以及經典的直播內容如虎芽、斗魚、歪歪等。該軟件的最大特點是其穩定性和無廣告…

【Python爬蟲高級技巧】BeautifulSoup高級教程:數據抓取、性能調優、反爬策略,全方位提升爬蟲技能!

大家好&#xff0c;我是唐叔&#xff01;上期我們聊了 BeautifulSoup的基礎用法 &#xff0c;今天帶來進階篇。我將分享爬蟲老司機總結的BeautifulSoup高階技巧&#xff0c;以及那些官方文檔里不會告訴你的實戰經驗&#xff01; 文章目錄 一、BeautifulSoup性能優化技巧1. 解析…

【愚公系列】《高效使用DeepSeek》055-可靠性評估與提升

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

C# Winform 入門(12)之制作簡單的倒計時

倒計時效果展示 控件展示 以下均是使用label來形成的 label 的 BorderStyle&#xff1a;Fixed3D ForeColor&#xff1a;Red Blackground&#xff1a;Black label 的屬性 Name&#xff1a; txtyear txtmonth txtday txttime txtweek txtDays txtHour txtM…

edge webview2 runtime跟Edge瀏覽器軟件安裝包雙擊無反應解決方法

軟件安裝報錯問題有需要遠程文章末尾獲取聯系方式&#xff0c;可以幫你遠程處理各類安裝報錯。 一 、edge webview2 runtime跟Edge瀏覽器軟件安裝包雙擊無反應 在安裝edge webview2 runtime跟Edge瀏覽器雙擊無反應沒有出現安裝界面。這個可能是 新版本的Edge WebView2 Runti…

TDengine 從入門到精通(2萬字長文)

目錄 第一章:走進 TDengine 的世界 TDengine 是個啥? TDengine 的硬核特性 性能炸裂 分布式架構,天生可擴展 SQL 用起來賊順手 寫入方式花樣多 內置緩存,省心又省力 TDengine 能干啥? 智能制造 能源管理 物聯網平臺 工業大數據 第二章:上手 TDengine:安裝與…

keil5忽略警告

目錄 前言 風險不多做贅述。強迫癥患者使用。警告有時候就是問題關鍵&#xff0c;被屏蔽了就不會在意。小心使用 環境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.35.0.2 一、示例 警告內容如下&#xff1a; 二、解決辦法 1.先看這位 MDK-Keil AC6 …

【Linux】iptables命令的基本使用

語法格式 iptables [-t 表名] 管理選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]注意事項 不指定表名時&#xff0c;默認使用 filter 表不指定鏈名時&#xff0c;默認表示該表內所有鏈除非設置規則鏈的缺省策略&#xff0c;否則需要指定匹配條件 設置規則內容 -A&#xff1a…

MyBatis查詢語句專題、動態SQL、MyBatis的高級映射及延遲加載

一、MyBatis查詢語句專題 模塊名&#xff1a;mybatis-008-select 打包方式&#xff1a;jar 引入依賴&#xff1a;mysql驅動依賴、mybatis依賴、logback依賴、junit依賴。 引入配置文件&#xff1a;jdbc.properties、mybatis-config.xml、logback.xml 創建pojo類&#xff1a…

Visual Studio Code SSH 連接超時對策( keep SSH alive)

文章目錄 問題解決方法一&#xff1a;配置服務端關于ClientAliveInterval和ClientAliveCountMax1、打開終端&#xff0c;打開SSH配置文件&#xff1a;輸入以下命令&#xff1a;2、打開配置文件后&#xff0c;添加以下內容&#xff1a;3、添加后&#xff0c;Esc按 <Enter>…

學透Spring Boot — 014. Spring MVC的自動配置

這是學透Spring Boot的第14篇文章&#xff0c;更多文章請移步我的專欄&#xff1a; 學透 Spring Boot_postnull咖啡的博客-CSDN博客 目錄 沒有Spring Boot時的Spring MVC 使用Spring Boot后的Spring MVC Spring MVC的自動配置解析 明確目標 入口類 Spring容器的啟動 S…

SQL語句(三)—— DQL

目錄 基本語法 一、基礎查詢 1、查詢多個字段 2、字段設置別名 3、去除重復記錄 4、示例代碼 二、條件查詢 1、語法 2、條件列表常用的運算符 3、示例代碼 三、分組查詢 &#xff08;一&#xff09;聚合函數 1、介紹 2、常見的聚合函數 3、語法 4、示例代碼 &…

LENOVO聯想ThinkBook 16 G6 ABP(21KK)恢復預裝OEM原廠Win11系統鏡像

適用機型&#xff1a;【21KK】 鏈接&#xff1a;https://pan.baidu.com/s/1lbvIh4KTbqm8EZQZfxvNIQ?pwd7vp0 提取碼&#xff1a;7vp0 聯想原裝系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、Office辦公軟件、聯想瀏覽器、聯想電腦管家、聯想軟件商店、聯想智能引…

# 基于人臉關鍵點的多表情實時檢測系統

基于人臉關鍵點的多表情實時檢測系統 在計算機視覺領域&#xff0c;人臉表情識別技術已經取得了顯著的進展。它不僅可以用于娛樂應用&#xff08;如動態表情包生成&#xff09;&#xff0c;還能在心理健康監測、智能安防、人機交互等領域發揮重要作用。今天&#xff0c;我將分…

在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重構二開的開源項目 Dify-Plus

一、安裝環境信息說明 硬件資源&#xff08;GB 和 GiB 的主要區別在于它們的換算基數不同&#xff0c;GB 使用十進制&#xff0c;GiB 使用二進制&#xff0c;導致相同數值下 GiB 表示的容量略大于 GB&#xff1b;換算關系&#xff1a;1 GiB ≈ 1.07374 GB &#xff1b;1 GB ≈ …