由于官方沒有公布題目的數據, 所以代碼僅供參考
1.?密密擺放
題目鏈接:P12337 [藍橋杯 2025 省 AB/Python B 第二場] 密密擺放 - 洛谷
題目描述
小藍有一個大箱子,內部的長寬高分別是?200、250、240(單位:毫米),他要用這個大箱子來放一些同樣大小的小盒子,小盒子的外部長寬高分別是?30、40、50(單位:毫米)。小盒子允許從各個方向旋轉(包括可以平放和倒放)。
請問小藍最多可以在一個大箱子里面放多少個小盒子。
?代碼如下:
#include <bits/stdc++.h>
using namespace std;
int solve(int i,int j, int k){return i*j*k;
}
int main() {int ans=solve(200,250,240)/solve(30,40,50);cout<<ans<<endl;return 0;
}
2.??脈沖強度之和
題目描述
在藍橋電子工坊,工程師小藍正在設計一款智能脈沖生成器,用于驅動一種新型設備。該設備的運行依賴于特定的脈沖強度,用正整數 p 表示,其必須滿足以下三個條件:可由連續 10 個正整數之和組成:即存在一個正整數 k,使得脈沖強度 p=k+(k+1)+(k+2)+?+(k+9)。
各個數位上的數字都相同:例如 1111、22222、333333 等。
數值不超過 20255202:即 1≤p≤20255202。
通過計算所有符合條件的脈沖強度之和,小藍能夠優化設備運行模式。對此,請幫助他計算這一總和。
解題思路:?
1. ?p=k+(k+1)+(k+2)+?+(k+9)? => p=(k+k+9)*10/2=10*k+45
2. 解 p=10*k+45, 看k有沒有解, 就能驗證條件1了
3. 接著驗證p的每一位是否相等
4. 按順序枚舉p, 把所有符合條件的p累加起來
代碼如下:?
#include<bits/stdc++.h>
using namespace std;
const int maxP=20255202;
bool solve(long long p){string s=to_string(p); bool f=false;for(char c:s){if(c!=s[0]){f=true;break;}}return f;
}
int main(){long long ans=0;for(long long k=1;;k++){long long p=10*k+45; if (p > maxP) break;if(!solve(p)) ans+=p;}cout<<ans<<endl;return 0;
}
?3.?25 之和
題目描述
小藍最近對求和很著迷,給定一個正整數?n,他想求從?n?開始的連續?25?個整數的和,即?n+(n+1)+(n+2)+?+(n+24),請幫幫他吧。
輸入格式
輸入一行包含一個正整數?n。
代碼如下:?
#include <bits/stdc++.h>
using namespace std;
int main() {int n; cin>>n;long long ans =25*(n+(n+24))/2; cout<<ans<<endl;return 0;
}
4.??旗幟
小藍要畫一個 LANQIAO 圖形,并把這個圖形做成一個旗幟。圖形的形狀為一個?h×w?的矩形,其中?h?表示圖形的高,w?表示圖形的寬。當?h=5,w=10?時,圖形如下所示:
LANQIAOLAN
ANQIAOLANQ
NQIAOLANQI
QIAOLANQIA
IAOLANQIAO
圖形的規律是:第一行用?
LANQIAO
?重復填入,第二行開始,每行向左移動一個字符,用?LANQIAO
?重復填入。小藍需要把圖形中的每個字母都剪出來,以粘貼到旗幟上,他想知道,給定圖形的高和寬,圖形中有多少個?
A
。
?代碼如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{int h, w;cin >> h >> w;string s = "LANQIAO";int ans = 0;for (int i = 0; i < h; i++){for (int j = 0; j < w; j++){if (s[(i + j) % 7] == 'A'){ans++;}}}cout << ans<<endl;return 0;
}
5.?數列差分
題目描述:
小藍有兩個長度均為?n?的數列?A={a1?,a2?,?,an?}?和?B={b1?,b2?,?,bn?},將兩個數列作差定義為?C=A?B={c1?=a1??b1?,c2?=a2??b2?,?,cn?=an??bn?}。小藍將對數列?B?進行若干次操作,每次操作可以將數列?B?中的任意一個數更改為任意一個整數。在進行完所有操作后,小藍可以按任意順序將數列?B?重排,之后再計算數列?C。小藍想知道,最少操作多少次可以使得數列?C?中的所有數都為正整數。?
?代碼如下:
#include <bits/stdc++.h>
using namespace std;
int main() {int n; cin>>n; vector<long long> a(n); vector<long long> b(n);for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++) cin>>b[i];sort(a.begin(),a.end()); sort(b.begin(),b.end());int i=0; int j=0,ans=0;while(i<n&&j<n){if(a[i]>b[j]){i++;j++;ans++;}else{i++;}}cout<<(n-ans)<<endl;return 0;
}
6.?樹上尋寶
?小藍正在一棵含有?n?個結點的樹的根結點?1?上,他準備在這棵樹上尋寶。結點?i?上有一個物品,價值為?wi?。然而,小藍每次尋寶只能從根節點出發走不超過?k?步,每步只能選擇走?1?條邊或者?2?條邊,之后會自動拾取最終停留的結點上的物品并被傳送回根結點。請求出小藍最終能獲得的物品的總價值。
輸入格式
輸入的第一行包含兩個正整數?n,k,用一個空格分隔。
第二行包含?n?個正整數?w1?,w2?,?,wn?,相鄰整數之間使用一個空格分隔。
接下來?n?1?行,每行包含兩個正整數?ui?,vi?,用一個空格分隔,表示結點?ui??和結點?vi??之間有一條邊。
輸出格式
輸出一行包含一個整數表示答案。
?解題思路:bfs, 定義d[i]: 節點i到根節點的邊數距離, 每步選擇的時候, 能走2就不會走1
?d[i]/2?<=k, d[i]<=2*k
#include <bits/stdc++.h>
using namespace std;
int main() {int n;long long k;cin >> n >> k;vector<long long> w(n+1);for (int i = 1; i <= n; i++) {cin >> w[i];}vector<vector<int>> grap(n+1);for (int i = 0; i < n-1; i++) {int u, v;cin >> u >> v;grap[u].push_back(v);grap[v].push_back(u);}vector<int> d(n+1, -1);stack<int> st;d[1] = 0;st.push(1);while (!st.empty()) {int u = st.top(); st.pop();for (int v : grap[u]) {if (d[v] == -1) {d[v] = d[u] + 1;st.push(v);}}}long long ans = 0;long long maxD = 2 * k;for (int i = 1; i <= n; i++) {if (d[i] != -1 && d[i] <= maxD) {ans += w[i];}}cout << ans << endl;return 0;
}
?7.?破解信息
?在遙遠的未來,星際旅行已經成為常態。宇航員小藍在一次探險任務中,意外發現了一個古老的太空遺跡。遺跡中存放著一個數據存儲器,里面記錄著一段加密的信息。經過初步分析,小藍發現這段信息可以被表示為一個字符串?S,而解密的關鍵,在于找出?S?中字典序最大的回文子序列。
- 子序列:指從原字符串中抽取若干個字符(可以不連續),按照它們在原字符串中的相對順序排列所形成的新序列。例如,對于字符串?
abc
,其子序列包括?a
、b
、c
、ab
、ac
、bc
?和?abc
。- 字典序:指字符串按照字典中的排序規則比較大小的方式。對于兩個字符串,從左到右逐字符比較,先出現較大字符的字符串字典序更大;若比較到某個字符串結束仍未找到不同的字符,則較短的字符串字典序較小。例如,
abc
?<?abd
,而?ab
?<?abc
。現在,請你從字符串?S?中,找出字典序最大的回文子序列,幫助小藍解開這段來自星際文明的信息。
輸入格式
輸入一行包含一個字符串?S,表示加密的信息。
輸出格式
輸出一行包含一個字符串,表示?S?中字典序最大的回文子序列
解題思路:統計字符串中字典序最大的字符, 然后統計其出現次數。
不管是奇數次和偶數次都是回文的。
#include<bits/stdc++.h>
using namespace std;
int main()
{string s;cin >> s;char a=*max_element(s.begin(),s.end()); int count=0;for(char c:s){if(c==a) count++;} string ans;for(int i=0;i<count;i++){ans+=a;}cout<<ans<<endl;return 0;
}
?8.翻轉硬幣
題目描述
給定?n?行?m?列共?n×m?個硬幣,對于任意一個硬幣,我們將其價值視為與其相鄰(指上、下、左、右相鄰)的硬幣中與其正反相同的硬幣數的平方。
你可以進行任意次操作,每次可以選擇任意一行并將該行的硬幣全部翻轉。
求所有硬幣的價值之和最大可能是多少。
輸入格式
輸入的第一行包含兩個正整數?n,m,用一個空格分隔。
接下來?n?行,每行包含?m?個 0 或 1,表示給定的?n×m?個硬幣。
輸出格式
輸出一行包含一個整數表示答案。
?解題思路:這道題是一道DP題, 但是無所謂啊,我們直接寫暴力(注:追求前7題滿分,最后一題直接打個暴力),欺騙自己AK了
#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = {0, 0, -1, 1};
int main(){int n, m;cin >> n >> m;vector<vector<int>> a(n, vector<int>(m));for(int i = 0; i < n; i++){string s;cin >> s; for(int j = 0; j < m; j++){a[i][j] = s[j] - '0';}}long long ans = 0;int maxNum = 1 << n;for(int k = 0; k < maxNum; k++){int g[20][20];for(int i = 0; i < n; i++){bool f = (k >> i) & 1;for(int j = 0; j < m; j++){g[i][j] = a[i][j] ^ (f ? 1 : 0);}}long long total = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){int count = 0;for(int d = 0; d < 4; d++){int ni = i + dx[d];int nj = j + dy[d];if(ni >= 0 && ni < n && nj >= 0 && nj < m){if(g[ni][nj] == g[i][j]) {count++;}}}total += (long long)count * count;}}ans = max(ans, total);}cout << ans << endl;return 0;
}
感謝大家的點贊和關注,你們的支持是我創作的動力!
吐槽:難道是上次出題太難了, 這次就....
?
?