蓝桥杯2022初赛B组题目题解
真的真的很水啊 O.O
第一题:
题目描述:
运行限制:
思路:暴力演算即可(1 * 2+9 * 2+81 * 0+729 * 2)
附上代码:
#include <iostream>
using namespace std;
int main()
{
cout<<1*2+9*2+81*0+729*2<<endl;
return 0;
}
第二题:
题目描述:
运行限制:
思路:年份 2022 是不变的,而且不可能搭上顺子,所以只考虑后四位即可 可能搭上顺子的月份有: 1月:0120 ~ 0129 共 10 个,顺子是 012 (其中 0123 可以认为顺子是 123) 10月:1012,顺子是 012 11月:1123,顺子是 123 12月:1230,1231,顺子是 123 一共 14 个
附上代码:
#include<iostream>
using namespace std;
int main()
{
cout<<"14"<<endl;
return 0;
}
第三题:
题目描述:
一些要求以及样例:
运行限制:
思路:(取余,暴力模拟会超时) 小明一周做的题量为5a+2b,小明至少要花的周数为n/(5a+2b), 剩下的题量为n%(5*a+2*b),再判断一下一周内的五天能不能做完
附上代码:
#include<iostream>
using namespace std;
#define ll long long
int main()
{
ll a,b,n,cnt=0;
cin>>a>>b>>n;
cnt+=n/(5*a+2*b)*7;
n%=(5*a+2*b);
if (n <= a * 5)
{
cnt += n / a + (n % a != 0);
}
else
{
n -= a * 5;
cnt += 6 + (n > b);
}
cout << cnt << endl;
return 0;
}
第四题:
题目描述:
一些要求:
运行限制:
思路:注意每棵灌木在被修剪得那天还会先长高 1 厘米,然后再被修剪 对于每棵灌木,长到最高的时间段有两种可能:被剪后往右剪再拐回来,和被剪之后往左剪再拐回来假设某个灌木左侧有 x 棵灌木,右侧有 y 棵,容易发现这颗灌木的最大高度是 max(x, y) * 2,它的左(右)侧每有一颗灌木被剪前它都会长高 1 厘米,包括它自己被剪之前
附上代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++)
{
int x = max(i, n - i - 1);
cout << x * 2 << endl;
}
return 0;
}
第五题:
题目描述:
一些要求:
运行限制:
思路:贪心即可 本题要找A - B的最小值,以为A >= B,所以只要找到满足条件的最小进制数(最小为二进制)即可。
附上代码:
#include<iostream>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
const int MAXM = 100005;
int n, ma, mb;
int a[MAXM], b[MAXM];
ll ans = 0, bac = 1;
int main() {
cin >> n;
cin >> ma;
for (int i = 1; i <= ma; i++) {
cin >> a[i];
}
cin >> mb;
for (int i = 1; i <= mb; i++) {
cin >> b[i];
}
int i = ma, j = mb;
while (i > 0) {
ans += (a[i] - b[j]) * bac;
ans %= MOD;
ll p = max(a[i], b[j]) + 1;
bac *= max(p, 2LL);
bac %= MOD;
i--;
if (j) j--;
}
cout << ans << endl;
return 0;
}
第六题:
题目描述:
一些要求:
思路:二维前缀和+二分
暴力枚举的话肯定超时了,采用半枚举+二分查找的方法,时间复杂度大概 是O(n^3 * log(n))。假设 (i, j) 是子矩阵的起点坐标,(x, y) 是终点坐标,枚举 i, j, x,二分查找符合条件的最大 y,就是找起点为 (i, j) ,终点在第 x 行最多有多少个矩阵
附上代码:
#include<iostream>
using namespace std;
const int maxn = 501;
int a[maxn][maxn];
long long ans = 0;
int main(){
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
a[i][j] += a[i - 1][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int ii = i; ii <= n; ii++)
{
int l = 1, r = 1;
int sum = 0;
for (r = 1; r <= m; r++)
{
sum += a[ii][r] - a[i - 1][r];
while (sum > k)
{
sum -= a[ii][l] - a[i - 1][l];
l++;
}
ans += r - l + 1;
}
}
}
cout << ans << endl;
return 0;
}
剩下的鼠鼠真滴写不出来啦Orz…