蓝桥杯2022初赛B组题目题解

蓝桥杯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…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值