第十三屆藍橋杯B組c++國賽

A - 2022:

題目:

筆記:

一道經典的dp題:

(1)明確dp數組含義:

dp[i][j][k]: 表示前i個數字中選擇j個湊成k的方法數。

(2)確定狀態轉移方程:

dp[i][j][k] = dp[i - 1][j - 1][k - i] + dp[i - 1][j][k]

有兩種情況,如果當前遍歷到的數字i大于背包容量則肯定不取,如果小于則可以取。

(3)初始化:

由于后續的所有方法數都是依賴于底層組成0的方法數:

所以將第一層容量為0的背包都設置為1。

(4)遍歷順序:

就是從小到大遍歷即可,并未涉及狀態壓縮:

#include<bits/stdc++.h>
using namespace std;int main(){long long dp[2023][11][2023] = {0};for(int i = 0; i < 2023; i++){dp[i][0][0] = 1;}for(int i = 1; i < 2023; i++){for(int j = 1; j <= 10; j++){for(int k = 1; k < 2023; k++){if(i <= k){dp[i][j][k] = dp[i - 1][j - 1][k - i] + dp[i - 1][j][k];}else{dp[i][j][k] = dp[i - 1][j][k];}}}}cout << dp[2022][10][2022] << endl;return 0;
}

?B - 鐘表:

題目:

筆記:

簡單模擬題:

#include <bits/stdc++.h>
using namespace std;
int main()
{// 時針:// 360 / 12 = 30°// 30 / 60 = 0.5°// 0.5 / 60 = 1/120°// 分針:// 360 / 60 = 6°// 6 / 60 = 0.1°// 秒針:// 360 / 60 = 6°for(int i = 0; i <= 6; i++){for(int j = 0; j < 60; j++){for(int k = 0; k < 60; k++){double h = i * 30.0 + j / 2.0 + k / 120.0; // 6點附近double m = j * 6.0 + k / 10;double s = k * 6.0;double a = abs(m - h);double b = abs(s - m);if(a > 180){a = 360 - a;}if(b > 180){b = 360 - b;}if(a == 2 * b){if(i == 0 && j == 0 && k == 0){continue;}cout << i << " " << j << " " << k;}}}}return 0;
}

C - 0卡牌:

題目:

筆記:

這道題目有點貪心的意思:

我們的思路是優先將已有牌中數目最少的牌補齊:所以我們需要有一個數組來存儲已有牌的數目以及對應最多能夠補幾張:然后我們對該數組進行排序,優先補齊數量最少的牌查看是否能夠湊齊指定套數的牌:

D - 最大數字:

題目:

筆記:

為了更好地處理,我們先將數字轉換成字符串類型進行處理:

明確我們的目的:將數字改的盡可能的大,我們的限制條件是:opt_1操作次數不能超過A次,opt_2操作不能超過B次:我們可以先判斷opt_2的數量是否大于當前數字cur + 1,如果不大于就只選擇opt_1不再進行opt_2操作,如果當opt_2的數量大于cur + 1, 那么就優先將opt_2的數量消耗掉,因為opt_2只能通過正好將cur變成9才會變大,而opt_1無論怎樣都會使數字變大。

#include <iostream>
#include <sstream>
using namespace std;
typedef long long ll;int main() {ll n, a, b;cin >> n >> a >> b;stringstream ss;ss << n;string str = ss.str();for (ll i = 0; i < str.size(); i++) {ll digit = str[i] - '0'; // 將字符轉換為整數if (b >= digit + 1) {b -= (digit + 1);str[i] = '9';} else {if (a <= 0) break;ll need = 9 - digit;if (need <= a) {str[i] = '9';a -= need;} else {str[i] = digit + a + '0'; // 將整數轉換回字符a = 0;break;}}}// 使用 stringstream 將字符串轉換為整數ll result;stringstream(str) >> result;cout << result << endl;return 0;
}

但是這么寫只過90%,

E - 出差:

這道題就是一個迪杰斯特拉的模板題,讓我們找到一條從城市1出發到達城市n的最短路徑,

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
#define int long long
typedef pair<int,int>PII;
const int N=1e5+5,M=2*N;
int h[N],e[M],ne[M],w[M],a[N],dist[N],vis[N],idx;
void add(int x,int y,int z){e[idx]=y,w[idx]=z,ne[idx]=h[x],h[x]=idx++;//數組e是代表當前邊的終點//數組w是代表當前邊的權重//數組ne表示next的指針是只想同一起點的邊的下標
}
void dijkstra(){memset(dist,0x3f,sizeof dist);priority_queue<PII,vector<PII>,greater<PII> >q;q.push({0,1});dist[1]=0;while(q.size()){int dis=q.top().first;int s=q.top().second;q.pop();if(vis[s])continue;vis[s]=1;for(int i=h[s];~i;i=ne[i]){int j=e[i];if(dist[j]>dis+w[i]){dist[j]=dis+w[i];q.push({dist[j],j});}}}
}
signed main(){memset(h,-1,sizeof h);int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];while(m--){int x,y,z;cin>>x>>y>>z;add(x,y,z+a[y]);add(y,x,z+a[x]); }dijkstra();cout<<dist[n]-a[n]<<endl;return 0;
}
#include<bits/stdc++.h>
using namespace std;int main(){int n, m;cin >> n >> m;vector<int> t(n + 1, 0);for(int i = 1; i <= n; i++){cin >> t[i];}// 存圖:vector<vector<int>> grid(n + 1, vector(n + 1, INT_MAX));for(int i = 1; i <= m; i++){int start, end, cost;cin >> start >> end >> cost;grid[start][end] = cost + t[end];grid[end][start] = cost + t[start];}priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> que;vector<bool> visited(n + 1, false);que.push(make_pair(0, 1));vector<int> mindist(n + 1, INT_MAX);mindist[1] = 0;while(!que.empty()){pair<int, int> cur = que.top(); que.pop();int end = cur.first;int start = cur.second;if(visited[start])  continue;visited[start] = true;for(int i = 1; i <= n; i++){if(!visited[i] && grid[start][i] != INT_MAX && mindist[start] + grid[start][i] < mindist[i]){mindist[i] = grid[start][i] + mindist[start];que.push(make_pair(mindist[i], i));}}}if(mindist[n] == INT_MAX){cout << -1;}else{cout << mindist[n] - t[n];}return 0;
}

注意優先隊列中元素排列的順序。

F - 費用報銷:

題目:

筆記:

#include <bits/stdc++.h>
using namespace std;const int N = 1010;
int f[N][N * 5];
int s[N], last[N];
int d[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//每個月份的天數
int n, m, k;
struct Node
{int m, d, v, t;
} p[N];// 定義一個日期結構體:包含月份,天數,價值,相對年初的天數bool cmp(Node &a, Node &b)
{return a.t < b.t;
}int main()
{scanf("%d%d%d", &n, &m, &k);for (int i = 2; i <= 12; i++) s[i] = s[i - 1] + d[i - 1];// 前綴和計算當前月相對年初的天數// 為每一個日期結構體的t日期進行賦值:for (int i = 1; i <= n; i++){scanf("%d%d%d", &p[i].m, &p[i].d, &p[i].v);p[i].t = s[p[i].m] + p[i].d;}// 按日期結構的天數進行升序排列sort(p + 1, p + 1 + n, cmp);// 找出距離當前項目最近的可以選擇的項目的編號,因為當你遍歷到一個日期需要查看預支配對的上一個可行的日期。for (int i = 1; i <= n; i++)for (int j = 0; j < i; j++)if (p[i].t - p[j].t >= k)last[i] = j;for (int i = 1; i <= n; i++)for (int j = 0; j <= m; j++){    f[i][j] = f[i - 1][j]; // 不選第i個,狀態則為i-1if (p[i].v <= j && (p[i].t - p[i - 1].t) >= k)  // 如果選第i個,則要看背包是否裝得下才比較f[i][j] = max(f[i][j], f[i - 1][j - p[i].v] + p[i].v);}cout << f[n][m];return 0;
}

耗費大量精力也是終于復刻出來了:

這道題歸根到底就是一道01背包的題目,但是我們需要注意的是在我們對當前物品取與不取的選擇中,如果我們選擇取那么記憶化搜索調用上一個物品的最大金額dp[i - 1][j - v],這里并不僅僅是上一個物品,因為我們的限制條件是天數要大于等于k,所以上一個日期可能并沒有達到k,可能需要用到上上個日期或者上上上個日期,所以我們就需要注意到底是取哪一個日期作為i- 1,這里我們用到了一個last數組記錄每一個日期對應的上一個可選擇日期,我們利用一個快慢指針搜索距離當前日期最近的可選日期。然后就可以按正常的邏輯進行dp:

dp[i][j] = max(dp[i - 1][j], dp[last[i]][j - value] + value):

#include<bits/stdc++.h>
using namespace std;
struct date_m{int m, d, v, t;// t表示當前日期與年初的天數
};
// 用于結構體排序,將日期按距離年初的天數從小到大排序
bool com(date_m& a, date_m& b){return a.t < b.t;
}
// 每個月的日期,用來計算當前日期距年初的天數
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sum(int x){int a = 0;for(int i = 1; i < x; i++){a += mon[i];}return a;
}int main(){int n, m, k;cin >> n >> m >> k;vector<date_m> date(n + 1);for(int i = 1; i <= n; i++){cin >> date[i].m >> date[i].d >> date[i].v;date[i].t = sum(date[i].m) + date[i].d;}sort(date.begin(), date.end(), com);//cout << date[4].t << endl;vector<int> last(n + 1, 0);for(int i = 2; i <= n; i++){for(int j = 1; j < i; j++){if((date[i].t - date[j].t) >= k){last[i] = j;}}}vector<vector<int> > dp(n + 1, vector<int>(m + 1, 0));for(int i = 1; i <= n; i++){for(int j = 0;j <= m; j++){dp[i][j] = dp[i - 1][j];if(j >= date[i].v){dp[i][j] = max(dp[i - 1][j], dp[last[i]][j - date[i].v] + date[i].v);}}}cout << dp[n][m] << endl;return 0;
}

H - 機房:

題目:

筆記:

就是迪杰斯特拉的模板題:

#include<bits/stdc++.h>
using namespace std;
const int Max = 1e5 + 5;int main(){int n, m;cin >> n >> m;vector<int> edge[Max];// 讀取 m 條邊for(int i = 0 ; i < n - 1; i++){int a, b;cin >> a >> b;edge[a].push_back(b);edge[b].push_back(a);}vector<int> res(m, 0);for(int i = 0; i < m; i++){int u, v;cin >> u >> v;priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > que;vector<int> mindist(n + 1, INT_MAX); // 使用 INT_MAX 初始化mindist[u] = 0;vector<bool> vis(n + 1, false);que.push(make_pair(0, u));while(!que.empty()){pair<int, int> cur = que.top(); que.pop();int cost = cur.first;int start = cur.second;if(vis[start])  continue;vis[start] = true;int len = edge[start].size();for(int j = 0; j < len; j++){int dot = edge[start][j];if( mindist[dot] > mindist[start] + len){mindist[dot] = mindist[start] + len;que.push(make_pair(mindist[dot], dot)); // 更新優先隊列}}}// 檢查是否存在路徑if(mindist[v] != INT_MAX) {res[i] = mindist[v] + edge[v].size();} else {res[i] = -1; // 如果不存在路徑,輸出 -1}}for(int i = 0; i < m; i++){cout << res[i] << endl;}return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int Max = 1e5 + 5;int main(){int n, m;cin >> n >> m;vector<int> edge[Max];// 讀取 m 條邊for(int i = 0 ; i < n - 1; i++){int a, b;cin >> a >> b;edge[a].push_back(b);edge[b].push_back(a);}vector<int> res(m, 0);for(int i = 0; i < m; i++){int u, v;cin >> u >> v;priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > que;vector<int> mindist(n + 1, INT_MAX); // 使用 INT_MAX 初始化mindist[u] = 0;vector<bool> vis(n + 1, false);que.push(make_pair(0, u));while(!que.empty()){pair<int, int> cur = que.top(); que.pop();int cost = cur.first;int start = cur.second;if(vis[start])  continue;vis[start] = true;int len = edge[start].size();for(int j = 0; j < len; j++){int dot = edge[start][j];if(!vis[dot] && mindist[dot] > mindist[start] + len){mindist[dot] = mindist[start] + len;que.push(make_pair(mindist[dot], dot)); // 更新優先隊列}}}// 檢查是否存在路徑if(mindist[v] != INT_MAX) {res[i] = mindist[v] + edge[v].size();} else {res[i] = -1; // 如果不存在路徑,輸出 -1}}for(int i = 0; i < m; i++){cout << res[i] << endl;}return 0;
}

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

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

相關文章

C++中的引用和解引用,及在Lambda中的簡單使用

目錄 摘要 引用&#xff08;Reference&#xff09; 定義 用法 解引用&#xff08;Dereference&#xff09; 定義 用法 Lambda表達式結合引用和解引用 引用結合Lambda表達式 解引用結合Lambda表達式 較為復雜的使用 總結 摘要 在C中&#xff0c;引用&#xff08;Re…

linux 內核哪種鎖可以遞歸調用 ?

當數據被多線程并發訪問(讀/寫)時&#xff0c;需要對數據加鎖。linux 內核中常用的鎖有兩類&#xff1a;自旋鎖和互斥體。在使用鎖的時候&#xff0c;最常見的 bug 是死鎖問題&#xff0c;死鎖問題很多時候比較難定位&#xff0c;并且影響較大。本文先會介紹兩種引起死鎖的原因…

Java-----String類

1.String類的重要性 經過了C語言的學習&#xff0c;我們認識了字符串&#xff0c;但在C語言中&#xff0c;我們表示字符串進行操作的話需要通過字符指針或者字符數組&#xff0c;可以使用標準庫中提供的一系列方法對字符串的內容進行操作&#xff0c;但這種表達和操作數據的方…

溝通程序化(1):跟著鬼谷子學溝通—“飛箝”之術

溝通的基礎需要傾聽&#xff0c;但如果對方聽不進你的話&#xff0c;即便你說的再有道理&#xff0c;對方也很難入心。讓我們看看鬼谷子的“飛箝”之術能給我們帶來什么樣的啟發吧&#xff01; “飛箝”之術&#xff0c;源自中國古代兵法家、縱橫家鼻祖鬼谷子的智慧&#xff0…

SpringBootWeb 篇-深入了解 Spring 異常處理、事務管理和配置文件參數配置化、yml 配置文件

&#x1f525;博客主頁&#xff1a; 【小扳_-CSDN博客】 ?感謝大家點贊&#x1f44d;收藏?評論? 文章目錄 1.0 配置文件 1.1 yml 配置文件 1.2 參數配置化 1.2.1 使用 Value 注解注入單個配置參數 1.2.2 使用 ConfigurationProperties 注解將一組相關配置參數注入到一個類中…

discuz論壇怎么修改備案信息

大家好&#xff0c;今天給大家分享下discuz如何填寫備案信息并且展示在網站首頁。大家都知道國內網站都需要備案&#xff0c;不通過備案的網站上是沒辦法通過域名打開的。大家也可以通過搜索網創有方&#xff0c;或者直接點擊網創有方 查看懸掛備案號后的效果。 首先大家可以看…

如何在CentOS中合理劃分磁盤空間以優化系統性能

目錄 前言 理想的分區方案 為什么需要單獨分區 安全性 性能 管理和維護 穩定性和可靠性 升級和兼容性 結論 前言 在進行CentOS系統的安裝和配置時&#xff0c;合理劃分磁盤空間是確保系統性能、安全性和易于管理的關鍵步驟。本文將探討如何根據系統的硬件配置和預期用途…

安全測試掃描利器-Burpsuite

&#x1f525; 交流討論&#xff1a;歡迎加入我們一起學習&#xff01; &#x1f525; 資源分享&#xff1a;耗時200小時精選的「軟件測試」資料包 &#x1f525; 教程推薦&#xff1a;火遍全網的《軟件測試》教程 &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1…

vscode常用插件及插件安裝方式

一、常用插件 Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code 說明&#xff1a;中文語言包擴展&#xff08;簡體&#xff09; open in browser 說明&#xff1a;可以在默認瀏覽器或應用程序中打開當前文件 Auto Rename Tag 說明&#xff1a;自動重…

Linux 命令:awk

1. 寫在前面 本文主要介紹 Linux “awk” 命令&#xff1a;“awk” 是另一個強大的文本處理工具&#xff0c;用于處理和操作結構化數據&#xff0c;如日志文件和命令輸出。它可以根據需要為我們打印特定的列值。 公眾號&#xff1a; 滑翔的紙飛機 2. awk 命令 我們能用 awk 做…

Android 控件保持寬高比得幾種方式

文章目錄 Android 控件保持寬高比得幾種方式adjustViewBounds百分比布局ConstraintLayout自定義View Android 控件保持寬高比得幾種方式 adjustViewBounds 僅適用于 ImageView&#xff0c;保持橫豎比。 <ImageViewandroid:layout_width"match_parent"android:l…

動態規劃(Dynamic-Programming)問題講解

動態規劃類問題 從已知子問題的解&#xff0c;推導出當前問題的解 推導過程可以表達為一個數學公式用一維或二維數組來保存之前的計算結果&#xff08;可以進一步降維優化&#xff09; 將當前問題 分解成子問題 &#xff0c;找出遞歸公式&#xff0c;分階段進行求解 求解過程中…

vue3+ts封裝一個button組件

創建一個新的Button組件文件 Button.vue&#xff1a; <template><button :class"buttonClass" :disabled"disabled" click"handleClick"><slot></slot><i v-if"icon" :class"icon"></i&g…

python 生成器yield

生成器 創建生成器的方式 生成器推導式yield關鍵字 生成器相關方法 for&#xff1a;循環遍歷生成器中的每一個值next&#xff1a;獲取生成器中的下一個值 生成器注意點 代碼執行到yield會暫停&#xff0c;然后把結果返回出去&#xff0c;下次啟動生成器會在暫停的位置繼續執行…

進程間通信(27000字超詳解)

&#x1f30e;進程間通信 文章目錄&#xff1a; 進程間通信 進程間通信簡介 ??????進程間通信目的 ??????初識進程間通信 ??????進程間通信的分類 匿名管道通信 ??????認識管道 ??????匿名管道 ??????匿名管道測試 ??????管道的四種…

第十五課,海龜畫圖:抬筆與落筆函數、畫曲線函數

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起與落下畫筆函數 當使用上節課學習的這個turtle.forward()&#xff1a;畫筆前進函數時&#xff0c;畫筆會朝著當前方向在畫布上留下一條指定&#xff08;像素&#xff09;長度的直線&#xff0c;但你可能發現&a…

Map Python用法:深度解析與應用探索

Map Python用法&#xff1a;深度解析與應用探索 在Python編程中&#xff0c;map() 函數是一種強大的內置高階函數&#xff0c;用于對可迭代對象中的每個元素應用指定的函數&#xff0c;并返回一個新的迭代器&#xff0c;其中包含函數應用后的結果。本文將從四個方面、五個方面…

Bean的生命周期中有哪些對外開放的接口,及各種作用

Bean的生命周期中有哪些對外開放的接口&#xff0c;及各種作用 在 Spring 框架中&#xff0c;Bean 的生命周期可以通過一系列的回調接口來管理和控制。以下是 Spring 中對外開放的主要 Bean 生命周期接口以及它們的作用&#xff1a; InitializingBean 和 DisposableBean 接口&…

C++|set、map模擬實現<——紅黑樹

目錄 一、紅黑樹的迭代器 1.1紅黑樹迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用紅黑樹搭配map和set(仿函數) 三、紅黑樹封裝map和set(簡易版…

springboot + Vue前后端項目(第十三記)

項目實戰第十三記 寫在前面1.建立角色表2. 后端代碼生成2.1 RoleController 3. 前端頁面的搭建3.1 Role.vue3.2 路由3.3 Aside.vue3.4 頁面效果 4.建立菜單表5.后端代碼編寫5.1 Menu5.2 MenuController 6.前端頁面的搭建6.1 Menu.vue6.2 路由6.3 Aside.vue6.4 頁面效果 總結寫在…