0
点赞
收藏
分享

微信扫一扫

2022年蓝桥杯c/c++ b组解析(持续更新中)

冶炼厂小练 2022-04-13 阅读 103

上午结束了蓝桥杯c/c++ b组比赛,对于比赛过程与争议这里就不再多说了,还是把题目记录下来同时为日后更上一层楼吧。
首先总结一下,本人实力一般,这次要当炮灰了,填空对了1个,(第2个题目也太有争议了,真的醉了),编程大题大概能对C、D、F、最后一个I(本题蓝桥杯14年考过类似的,基本上思路是一样的,不过这里需要数字很大,时间上面最多跑到40%吧),其余是没有时间来看。愁ing
总的算了一下大概40-50分,省一是无缘了,省二都不一定有了(毕竟是线上考吧)
我感觉难度还是有的,不过相比于21年送分是到位的,比20年稍微难一些,毕竟这里大题有8道了,时间上多少较往年还是不够的,怎么说呢,还是继续努力吧,后面多加努力吧。
欢迎大家留言讨论,讨论你的想法与思路,共同学习!

目录

九进制转十进制 (5分)

在这里插入图片描述
额,这个题简直送分吧,不过就相当于开胃菜吧,直接手算了。
答案是 1478

2*9^3+2*9+2*9^0

顺子日期 (5分)

在这里插入图片描述
首先这个有几个注意点,第一 为什么20221023不是顺子日期,说明210不是顺子(不清楚0到底算不算),第二 题目说20220123出现了一个顺子123,说明012不是顺子,进而说明0不算(迷?)
附应该有的日期,不一定正确,有待考证
答案 5 (?不知道是啥)

20220123
20220321 // 
20221123
20221230
20221231

刷题统计(10分)

在这里插入图片描述
送分题目,也就是签到题啦,注意开long long.

#include <iostream>
#include <algorithm>

using namespace std;

int n;
typedef long long ll;
ll a,b,day,sum;

int main(){
	cin>>a>>b>>n;
	day=0,sum=0;
	int count=1;
	while(sum<n){
		int temp=count%7;
		if(temp>=1||temp<=5) sum+=a;
		if(temp==6||temp==0) sum+=b;
		count++;
	}
	printf("%d",count);
	return 0;
}

修剪灌木 (10分)

在这里插入图片描述
话说我做个题目就感觉有数学方法可以解决,因为很明显是有规律的,为什么呢?你从左边剪到右边,再从右边剪到左边,这里就会感到这其中存在对称性。
不过一开始我还好奇这个4 2 4怎么来的,后来看了题目才知道她是傍晚修剪的,早上还可以剪的。
再找N=4,可以得知数据为6 4 4 6.
在1-n/2课树,可以发现规律是2*(n-i)
那么就知道这个当N为偶数的时候将数组对半开,当奇数也是同理。
下面附代码。

#include <iostream>
#include <cstring>
using namespace std;

int n;

int main(){
	cin>>n;
	int a[n+1];
	memset(a,0,sizeof(a));
	if(n%2==0){
		for(int i=1;i<=n/2;i++){
			a[n+1-i]=a[i]=2*(n-i);
		}
	}else{
		for(int i=1;i<=n/2+1;i++){
			a[n+1-i]=a[i]=2*(n-i);
		}
	}
	for(int i=1;i<=n;i++){
		cout<<a[i]<<endl;
	}
	return 0;
}

X进制减法 (15分)

在这里插入图片描述
题目没看懂,到现在都不知道怎么从321到65,留个坑吧,后续一定要补上!

统计子矩阵(15分)

在这里插入图片描述

这个题目呢我一开始想用4个循环的来做,发现太暴力了,时间上面会比较慢。
后面我想到只要2个循环就可以解决,具体方法如下:

#include<iostream>
using namespace std;

int a[505][505] = { 0 }, b[505][505] = { 0 };

int main()
{
	int n, m, k, i, j, sum = 0;
	cin >> n >> m >> k;
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			cin >> a[i][j];
			if (a[i][j] <= k) {
				sum++;
			}
			b[i][j] = a[i][j];
			if (j - 1 >= 0) {
				b[i][j] += b[i][j - 1];
			}
			if (i - 1 >= 0) {
				b[i][j] += b[i - 1][j];
			}
			int l = j - 1;
			while (l >= 0) {
				if (b[i][j] - b[i][l] <= k) {
					sum++;
				}
				l--;
			}
			l = i - 1;
			while (l >= 0) {
				if (b[i][j] - b[l][j] <= k) {
					sum++;
				}
				l--;
			}
		}
	}
	cout << sum << endl;
	return 0;
}


积木画(20分)

在这里插入图片描述
这个题目考场没有做出来,参考其他博主的代码,后期再深入研究一下:

#include <iostream>
using namespace std;

const long long MOD = 1e9 + 7;

const int maxn = 1e7 + 100;
long long dp[maxn];

int main() {
	int n;
	cin >> n;
	dp[0] = 1;
	dp[1] = 1;
	dp[2] = 2;
	for (int i = 3; i <= n; i++) {
		// 注意每次相加后都要取余
		dp[i] = (((dp[i - 1] + dp[i - 2]) % MOD) + dp[i - 3] * 2) % MOD;
	}
	cout << dp[n] << endl;
	return 0;
} 

扫雷(20分)

在这里插入图片描述
后期填坑吧…

李白打酒加强版(25分)

在这里插入图片描述
多的不说,出了往年题目的类似版,也是没啥了...
不过不知道这个数据能跑到多少

#include <iostream>

using namespace std;

long long cnt=0;

int mod=1000000007;

int  n,m,c=2;

void dfs(int x,int y,int c){
	if(x<0||y<0) return ;
	if(x==0&&y==1&&c==1){
		cnt++;
		cnt=cnt%mod;
		return;
	}
	if(x>0) dfs(x-1,y,c*2);
	if(y>0) dfs(x,y-1,c-1);
}

int main(){
	int m,n;
	cin>>n>>m;
	dfs(n,m,c);
	cout<<cnt<<endl;
}

砍竹子(25分)

在这里插入图片描述

有时间看吧,填坑。

举报

相关推荐

0 条评论