蓝桥真题讲解
目录
第一题
题目链接
题目解析
填空解答
第二题
题目链接
题目解析
代码原理
代码编写
第三题
题目链接
题目解析
代码原理
代码编写
本题总结
第四题
题目链接
题目解析
代码原理
代码编写
第五题
题目链接
题目解析
代码原理
编辑代码编写
使用了vector
使用数组
本题总结
第一题
题目链接
0最大降雨量 - 蓝桥云课
题目解析
填空解答
看不懂的小伙伴可以看一下下面的这张图
第二题
题目链接
0重新排序 - 蓝桥云课
题目解析
代码原理
代码编写
#include<iostream>#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll N = 100000;ll a[N], cnt[N];int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);ll n = 0, m = 0;cin >> n;for(ll i = 1; i <= n; i++){cin >> a[i];}cin >> m;ll l = 0, r = 0;while(m--){cin >> l >> r;cnt[l]++;cnt[r + 1]--;}for(ll i = 1; i <= n; i++){cnt[i] += cnt[i - 1];}ll sumF = 0, sumS = 0;for(ll i = 1; i <= n; i++){sumF += cnt[i] * a[i];}sort(a + 1, a + 1 + n);sort(cnt + 1, cnt + 1 + n);for(ll i = 1; i <= n; i++){sumS += cnt[i] * a[i];}cout << sumS - sumF << endl;return 0;}
第三题
题目链接
0时间显示 - 蓝桥云课
题目解析
代码原理
略
代码编写
#include<iostream>#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ll n = 0,h = 0, m = 0, s = 0;cin >> n;h = (n / 1000) / 3600 % 24;m = (n / 1000) % 3600 / 60;s = (n / 1000) % 3600 % 60;cout << setw(2) << setfill('0') << h << ':';cout << setw(2) << setfill('0') << m <<':';cout << setw(2) << setfill('0') << s << endl;return 0;}
秒化成时需要整除3600再取模24
秒化成分需要取模3600再取整60
秒化成秒需要取模3600再取模60
本题总结
第四题
题目链接
题目解析
代码原理
用上set容器,将符合边缘字符条件的字母放进set容器中,之后再将原字符串与set容器中的字母进行匹配,没有在set容器中出现的的直接将其放进另一个新字符串中,循环往复即可,直至符合这两个条件——第一个条件:set容器为空;第二条件:新字符串长度为0。则结束循环
代码编写
#include <iostream>#include<bits/stdc++.h>using namespace std;int main(){// 请在此输入您的代码string s1,s2;set<int> q;cin >> s1;while(true){for(int i = 1; i < s1.size() - 1; i++){if(s1[i] == s1[i - 1] && s1[i] != s1[i + 1]){q.insert(i + 1);q.insert(i);}if(s1[i] == s1[i + 1] && s1[i] != s1[i - 1]){q.insert(i - 1);q.insert(i);}}if(q.empty()) {cout << s1 << endl;break;}s2.clear();for(int i = 0; i < s1.size(); i++){if(q.find(i) == q.end()){s2 += s1[i];}}s1 = s2;q.clear();if(s1.size() == 0) {cout << "EMPTY"<< endl;break;}}return 0;}
因为2的64次方很大因此我们可以考虑死循环,退出循环的条件前面也说了,那么这里有两个地方需要注意一下:第一个地方是s2.clear(),每次使用前需要先清除上一次残留的字符串,第二个地方是q(即set容器)中的残留元素,这两个地方少一个就会造成死循环
第五题
题目链接
0子矩阵 - 蓝桥云课
题目解析
代码原理

代码编写
使用了vector
#include<iostream>
#include<vector>
using namespace std;
int jisuan(const vector<vector<int> >& brr, int a, int b)
{int max_val = -0x3f3f3f3f, min_val = 0x3f3f3f3f;for(int c = 0; c < a; c++){for(int d = 0; d < b; d++){min_val = min(min_val, brr[c][d]);max_val = max(max_val, brr[c][d]);}}return (long long)max_val * min_val ;
}
int main()
{int n = 0, m = 0, a = 0, b = 0;cin >> n >> m >> a >> b;vector<vector<int> > arr(n, vector<int>(m));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> arr[i][j];}}vector<vector<int> > brr(n, vector<int>(m));int sum = 0;for(int i = 0; i <= n - a; i++){for(int j = 0; j <= m - b; j++){for(int x = 0; x < a; x++){for(int y = 0; y < b; y++){brr[x][y] = arr[i + x][j + y];}}sum += jisuan(brr, a, b) % 998244353;}}cout << sum;return 0;
}
使用数组
#include <iostream>
#include <climits>using namespace std;const int MOD = 998244353;// 计算子矩阵的价值
int calculateValue(int subMatrix[][1000], int a, int b) {int maxVal = INT_MIN;int minVal = INT_MAX;for (int i = 0; i < a; ++i) {for (int j = 0; j < b; ++j) {maxVal = max(maxVal, subMatrix[i][j]);minVal = min(minVal, subMatrix[i][j]);}}return (long long)maxVal * minVal % MOD;
}// 暴力解法主函数
int bruteForce(int matrix[][1000], int n, int m, int a, int b) {int sum = 0;// 遍历所有可能的子矩阵for (int i = 0; i <= n - a; ++i) {for (int j = 0; j <= m - b; ++j) {int subMatrix[1000][1000];// 提取子矩阵for (int x = 0; x < a; ++x) {for (int y = 0; y < b; ++y) {subMatrix[x][y] = matrix[i + x][j + y];}}sum = (sum + calculateValue(subMatrix, a, b)) % MOD;}}return sum;
}int main() {int n, m, a, b;cin >> n >> m >> a >> b;int matrix[1000][1000];for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> matrix[i][j];}}cout << bruteForce(matrix, n, m, a, b) << endl;return 0;
}
本题总结
1.二维数组的定义或二维的vector的定义,这里需要注意的是
vector<vector<int> /*空格*/ > arr(n, vector<int>(m));
相信大家都发现了吧第一个vector的尖括号和第二个尖括号之间有空格,当然这个只在devc++中需要加空格,其他编译器不会出现这种情况
2.二维数组或二维vector的传参
vector
数组
本篇文章的内容就先到这里,我们下期再见!