2022年蓝桥杯第十三届CC++大学B组真题及代码

news2025/4/3 13:56:12

目录

1A:九进制转十进制

2B:顺子日期(存在争议)

3C:刷题统计

解析代码(模拟)

4D:修剪灌木

解析代码(找规律)

5E:X进制减法

解析代码1(模拟)

解析代码2(数学)

6F:统计子矩阵

解析代码(二维前缀和+双指针)

7G:积木画

解析代码(dp+滚动数组)

8H:扫雷

解析代码(待续)

9I:李白打酒加强版

解析代码1(dp)

解析代码2(dp)

10J:砍竹子

 解析代码(待续)


1A:九进制转十进制

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

九进制正整数 (2022)转换成十进制等于多少?

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 512M


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  printf("%d",2+2*9+0+2*9*9*9); // 1478
  return 0;
}

2B:顺子日期(存在争议)

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 256M


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  //直接手算,注意题中第三行,如果012不算就是4个,但答案是14
  //1230  1231
  //1123
  //1012
  //这些月份都没有:09  08 07 06 05 04 03 02
  //0120 0121 0122 0123 0124 0125 0126 0127 0128 0129
  printf("14");
  return 0;
}

3C:刷题统计

问题描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a,bn.

输出格式

输出一个整数代表天数。

样例输入

10 20 99

样例输出

8

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 256M


解析代码(模拟)


//#include <bits/stdc++.h>
#include <iostream>
#define endl '\n'
#define int long long
using namespace std;

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int a, b, n, i, week, day;
	cin >> a >> b >> n;
	week = n / (a * 5 + b * 2);
	day = week * 7;
	n -= (a * 5 + b * 2) * week;
	for (i = 1; i <= 5; ++i)
	{
		if (n > 0)
		{
			n -= a;
			day++;
		}
	}
	for (i = 1; i <= 2; ++i)
	{
		if (n > 0)
		{
			n -= b;
			day++;
		}
	}
	cout << day << endl;
	return 0;
}

4D:修剪灌木


解析代码(找规律)

        解决本题的关键是判断每棵灌木最高的高度,简单地思考不难发现该高度与该点距离左、右侧边界的距离相关。定义左侧边界距离为 i  - 1 ,则右侧边界可计算出为:n − i 。

//#include <bits/stdc++.h>
#include <iostream>
#define endl '\n'
#define int long long
using namespace std;

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n = 0;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		cout << max(i - 1, n - i) * 2 << endl;
	}
	return 0;
}

5E:X进制减法

        很多同学不会做这道题是因为题目的意思没有理清楚。其实题目的要求很简单:给定了两个整数 A,B,这两个数每一位上可以是任意进制,但是A,B相同位上进制规则相同。举个例子:

  • 若 X,Y,Z 分别代表 5,6,2 进制,则 A = 4*6*2 + 2*6 + 1 ,B = 3*6*2 + 5*6 + 0
  • 如 X,Y,Z 分别代表 6,7,3 进制,则 A = 4*7*3 + 2*7 + 1 ,B = 3*7*3 + 5*7 + 0

无论每一位进制为何值,都需要满足:

  • 进制数要大于改位的最大值
  • 进制数的最小值为 2

满足上述要求的每一位进制所得到的数:A,B ,题目要求获取 A - B 的最小值。


解析代码1(模拟)

每一位最小可能得结果:max(a[i] ,b[i]) + 1(再和2取一下max,因为最小为二进制)

#include <iostream> //  D题:X 进制减法
#include <algorithm>
#define endl '\n'
#define int long long
using namespace std;
const int mod = 1000000007;
int n, ma, mb, a[100001], b[100001];

signed 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];
	if (ma > mb) // 高位补0
	{
		for (int i = ma; i > ma - mb; --i)
			b[i] = b[i - (ma - mb)];
		for (int i = 1; i <= ma - mb; ++i)
			b[i] = 0;
	}
	int res = 0;
	for (int i = 1; i <= ma; ++i)
	{
		res *= max(max(a[i], b[i]) + 1, (int)2);
		res %= mod;
		res += a[i] - b[i];
		if (res < 0)
			res += mod;
		if (res >= mod)
			res -= mod;
	}
	cout << res;
	return 0;
}

解析代码2(数学)

        平时X进制的数,各位数字的进制是相同的,每位数字的权重是X^n(n为该位数字后面的位数),比如二进制1000中首位的1的权重是2^3=8;但是本题各位数字进制不同,该位数字的权重其实是后面各位数字的进制的乘积。

        欲使A-B最小,只需使得各位数字取得合法范围内的最小进制即可,具体做法就是对A和B中相同数位的数字取int tmax = max(a[i], b[i]),该位的合法最小进制即为max(tmax + 1, 2),因为最小进制不能小于2;而对于X进制的数来说,合法的最大数字是X-1,例如8进制中最大数字是7,二进制中最大数字是1。

         而求A和B的值,只需要再开一个数组存储各位数字的实际权重,再将各位数字和对应的权重相乘后相加即可。需要注意的是这个题数据比较大,需要多次取模,特别是最后计算最终结果的时候,应(A - B + mod) % mod,否则可能A本来比B大,但是取模后比B小,这样A-B可能会出现负值。

#include <iostream> //  X 进制减法
#include <algorithm>
#define endl '\n'
#define int long long
using namespace std;
const int M = 100010, N = 1010, mod = 1000000007;
int a[M], b[M], w[M];  // a[] 存储A各位数字   b[] 存储B各位数字   w[] 存储各位的进制
int n;
int Ma, Mb;
int mul[M];  // 各位数字的实际权重
int A, B;

signed main()
{
	cin >> n;  // 最大进制
	cin >> Ma;
	for (int i = Ma; i >= 1; --i) 
		cin >> a[i];

	cin >> Mb;
	for (int i = Mb; i >= 1; --i) 
		cin >> b[i];

	int MM = max(Ma, Mb);  // A B 中最大的位数
	for (int i = MM;i >= 1; --i) // 确定各位进制 w[i]
	{
		int tmax = max(a[i], b[i]);
		w[i] = max((int)2, tmax + 1);
	}

	mul[1] = 1;
	for (int i = 2; i <= MM; ++i) // 计算权重
		mul[i] = w[i - 1] * mul[i - 1] % mod;

	for (int i = Ma; i >= 1; --i) // 计算A
		A = (A + a[i] * mul[i]) % mod;

	for (int i = Mb; i >= 1; --i)  // 计算B
		B = (B + b[i] * mul[i]) % mod;

	cout << (A - B + mod) % mod << endl;

	return 0;
}

6F:统计子矩阵


解析代码(二维前缀和+双指针)

如果直接用 前缀和 + 暴力,复杂度将是O(N^4 ),

        优化的方法是:枚举子矩阵的 左边界i 和 右边界j,用快指针lower 枚举 子矩阵的下边界,慢指针upper 维护子矩阵的上边界。

        如果得到的子矩阵的权值和 大于 k,则慢指针s 前进,而子矩阵和必将单调不增,慢指针继续前进,直到 子矩阵的和 不大于k,慢指针没必要前进了,因为该子矩阵的所有宽度为 j - i + 1 的子矩阵(总共 t - s + 1 种)一定满足要求,更新该情况对答案的贡献 t - s + 1;反之,如果慢指针s越界(s > t),则不操作,直接进入下层循环

#include <iostream>
#define endl '\n'
#define int long long
using namespace std;
const int N = 5e2 + 3;
int n, m, k;
int arr[N][N];

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> k;
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j) // 直接在原数组基础得到前缀和数组
		{
			cin >> arr[i][j];
			arr[i][j] += arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1];
		}
	}

	int ans = 0;
	for (int i = 1; i <= m; ++i)
	{
		for (int j = i; j <= m; ++j)
		{
			for (int left = 1, right = 1; right <= n; ++right)
			{
				while (left <= right && arr[right][j] - arr[left - 1][j] - arr[right][i - 1] + arr[left - 1][i - 1] > k)
					++left;
				if (left <= right)
					ans += right - left + 1;
			}
		}
	}
	cout << ans << '\n';
	return 0;
}

7G:积木画


解析代码(dp+滚动数组)

#include <iostream> //  G题:积木画
#include <cstring>
#define endl '\n'
using namespace std;
#define int long long
const int mod = 1000000007;
int n, v[2][2], dp[2][2];
// 数组第1维表示上一行有没有积木,第二维表示下一行有没有积木,0是没有,1是有
inline void add(int& x, int y)
{
	x += y;
	x %= mod;
}

signed main()
{
	cin >> n; // 用例:3
	dp[0][0] = 1;
	for (int i = 1; i <= n; ++i) // i表示第i列,
	{
		memset(v, 0, sizeof(v));
		add(v[0][0], dp[0][0]); // 00 能转变为的情况
		add(v[1][1], dp[0][0]);
		add(v[0][1], dp[0][0]);
		add(v[1][0], dp[0][0]);

		add(v[0][1], dp[1][0]); // 10 能转变为的情况
		add(v[1][1], dp[1][0]);

		add(v[1][0], dp[0][1]); // 01 能转变为的情况
		add(v[1][1], dp[0][1]);

		add(v[0][0], dp[1][1]); // 11 能转变为的情况

		memcpy(dp, v, sizeof(dp)); // 把dp给v
	}
	cout << dp[0][0];
	return 0;
}

8H:扫雷


解析代码(待续)

(待续)

9I:李白打酒加强版


解析代码1(dp)

状态表示:本题的解法是动态规划,定义三维数组 dp存储状态,d p [ i ] [ j ] [ k ]表示路上遇到了 i 次店,j 次花后,酒壶中酒剩余 k 斗的方法数。

初始化:初始情况李白没有遇到店、花,初始状态下酒壶中有 2 斗,因此定义 dp [ 0 ] [ 0 ] [ 2 ] = 1 为初始状态。

状态转移方程:

  • 如果当前状态遇到一次店,即 i > 0且剩余酒的数量应该是之前的两倍,即 k % 2 == 0,此时 dp [ i ] [ j ] [ k ] + = dp [ i − 1 ] [ j ] [ k / 2 ] 
  • 如果当前状态遇到一次花,即 j > 0,此时 dp [ i ] [ j ] [ k ] + = dp [ i ] [ j − 1 ] [ k + 1 ],k+1 表示酒被喝掉了一斗。

返回值:因为最后一次遇到的一定是花且剩余酒的数量为 0 ,不妨将状态转换为:共遇到 n次店,m − 1次花且剩余酒的数量为 1,这样返回 dp [ n ] [ m − 1 ] [ 1 ]就是题目所求。

#include <iostream>
#include <cstring>
#define endl '\n'
using namespace std;
const int mod = 1000000007;
const int M = 110;
int dp[M * 2][M][M];

signed main()
{
	memset(dp, 0, sizeof dp); // 0 表示花 1 表示店
	dp[0][0][2] = 1;
	int n, m;
	cin >> n >> m;
	for (int i = 0; i <= n; ++i)
	{
		for (int j = 0; j <= m; ++j)
		{
			for (int k = 0; k <= 101; ++k)
			{
				if (i == 0 && j == 0)
					continue;
				if (i > 0 && !(k & 1)) // 店
					dp[i][j][k] += dp[i - 1][j][k / 2];
				if (j > 0) // 花
					dp[i][j][k] += dp[i][j - 1][k + 1];
				dp[i][j][k] %= mod;
			}
		}
	}
	cout << dp[n][m - 1][1];
}

解析代码2(dp)

#include <iostream>
#include <cstring>
#define endl '\n'
using namespace std;
const int mod = 1000000007;
const int M = 110;
int dp[M * 2][M][M];
inline void add(int& x, int y)
{
	x += y;
	x %= mod;
}

signed main()
{
	// 第一维是遇到的建筑(店/花),第二维是店,第三维是剩余的酒
	memset(dp, 0, sizeof dp);
	dp[0][0][2] = 1;
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n + m; ++i) // 第i建筑
	{
		for (int j = 0; j <= n; ++j) // 第j个店,i-j 个花
		{
			for (int k = 0; k <= m + 1; ++k) // 还有k壶酒
			{
				if(dp[i - 1][j][k] != 0)
				{
					if (j < n)
						add(dp[i][j + 1][min(k * 2, m + 1)], dp[i - 1][j][k]);
					if (i - 1 - j < m && k != 0)
						add(dp[i][j][k - 1], dp[i - 1][j][k]);
				}
			}
		}
	}
	cout << dp[n + m - 1][n][1];
	return 0;
}

10J:砍竹子


 解析代码(待续)

(待续)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.oracle修改配置文件

1.找到oracle的安装路径 D:\app\baozi\product\11.2.0\dbhome_1\NETWORK\ADMIN &#xff0c;修改下面的两个文件。如果提示没有权限&#xff0c;可以先把这两个文件复制到桌面&#xff0c;修改完后&#xff0c;在复制回来。 2.查看自己电脑的主机名&#xff0c; 右击 - 此电脑 …

通义万相2.1 你的视频创作之路

通义万相2.1的全面介绍 一、核心功能与技术特点 通义万相2.1是阿里巴巴达摩院研发的多模态生成式AI模型&#xff0c;以视频生成为核心&#xff0c;同时支持图像、3D内容及中英文文字特效生成。其核心能力包括&#xff1a; 复杂动作与物理规律建模 能够稳定生成包含人体旋转、…

Muduo网络库实现 [四] - Channel模块

设计思路 具体来说每一个套接字都会对应一个 Channel 对象&#xff0c;用于对它的事件进行管理。可以对于描述符的监控事件在用户态更容易维护&#xff0c;以及触发事件后的操作流程更加的清晰 Channel模块是用于对一个描述符所需要监控的事件以及事件触发之后要执行的回调函…

XSS 攻击(详细)

目录 引言 一、XSS 攻击简介 二、XSS 攻击类型 1.反射型 XSS 2.存储型 XSS 3.基于 DOM 的 XSS 4.Self - XSS 三、XSS 攻击技巧 1.基本变形 2.事件处理程序 3.JS 伪协议 4.编码绕过 5.绕过长度限制 6.使用标签 四、XSS 攻击工具与平台 1.XSS 攻击平台 2.BEEF 五…

《ZooKeeper Zab协议深度剖析:构建高可用分布式系统的基石》

《ZooKeeper Zab协议深度剖析:构建高可用分布式系统的基石》 一、分布式协调的挑战与ZooKeeper的解决方案 1.1 分布式系统一致性难题 #mermaid-svg-iigak7YlgEw7o6lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-sv…

OpenCV 图形API(6)将一个矩阵(或图像)与一个标量值相加的函数addC()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 addC 函数将给定的标量值加到给定矩阵的每个元素上。该功能可以用矩阵表达式替换&#xff1a; dst src1 c \texttt{dst} \texttt{src1} \te…

同步SVPWM调制策略的初步学习记录

最近项目需要用到一些同步调制SVPWM相关的内容&#xff08;现在的我基本都是项目驱动了&#xff09;&#xff0c;因此对该内容进行一定的学习。 1 同步SVPWM调制的背景 我们熟知的一些知识是&#xff1a;SVPWM&#xff08;空间矢量脉宽调制&#xff09;是一种用于逆变器的调制…

排序算法3-交换排序

目录 1.常见排序算法 2.排序算法的预定函数 2.1交换函数 2.2测试算法运行时间的函数 2.3已经实现过的排序算法 3.交换排序的实现 3.1冒泡排序 3.2快速排序 3.2.1递归的快速排序 3.2.1.1hoare版本的排序 3.2.1.2挖坑法 3.2.1.3lomuto前后指针法 3.2.2非递归版本的快…

【Qt】数据库管理

数据库查询工具开发学习笔记 一、项目背景与目标 背景&#xff1a;频繁编写数据库查询语句&#xff0c;希望通过工具简化操作&#xff0c;提升效率。 二、总体设计思路 1. 架构设计 MVC模式&#xff1a;通过Qt控件实现视图&#xff08;UI&#xff09;&#xff0c;业务逻辑…

Ant Design Vue 中的table表格高度塌陷,造成行与行不齐的问题

前言&#xff1a; Ant Design Vue: 1.7.2 Vue2 less 问题描述&#xff1a; 在通过下拉框选择之后&#xff0c;在获取接口数据&#xff0c;第一列使用了fixed:left&#xff0c;就碰到了高度塌陷&#xff0c;查看元素的样式结果高度不一致&#xff0c;如&#x…

【qt】文件类(QFile)

很高兴你能看到这篇文章&#xff0c;同时我的语雀文档也更新了许多嵌入式系列的学习笔记希望能帮到你 &#xff1a; https://www.yuque.com/alive-m4b9n 目录 QFile 主要功能QFile 操作步骤QFile 其他常用函数案例分析及实现功能一实现&#xff1a;打开文件并显示功能二实现:另…

3. 实战(一):Spring AI Trae ,助力开发微信小程序

1、前言 前面介绍了Spring boot快速集成Spring AI实现简单的Chat聊天模式。今天立马来实战一番&#xff0c;通过Trae这个火爆全网的工具&#xff0c;来写一个微信小程序。照理说&#xff0c;我们只是极少量的编码应该就可以完成这项工作。开撸~ 2、需求描述 微信小程序实现一…

UE5新材质系统效果Demo展示

1、玉质材质&#xff0c;透明玻璃材质&#xff0c;不同透射和散射。 2、浅水地面&#xff0c;地面层&#xff0c;水层&#xff0c;地面湿度&#xff0c;水面高度&#xff0c;水下扰动&#xff0c;水下浇洒&#xff0c;水下折射 Substrate-Water Substrate-Water-CodeV2

wps 怎么显示隐藏文字

wps 怎么显示隐藏文字 》文件》选项》视图》勾选“隐藏文字” wps怎么设置隐藏文字 wps怎么设置隐藏文字

CXL UIO Direct P2P学习

前言&#xff1a; 在CXL协议中&#xff0c;UIO&#xff08;Unordered Input/Output&#xff09; 是一种支持设备间直接通信&#xff08;Peer-to-Peer, P2P&#xff09;的机制&#xff0c;旨在绕过主机CPU或内存的干预&#xff0c;降低延迟并提升效率。以下是UIO的核心概念及UI…

leetcode138.随即链表的复制

思路源于 【力扣hot100】【LeetCode 138】随机链表的复制&#xff5c;哈希表 采用一个哈希表&#xff0c;键值对为<原链表的结点&#xff0c;新链表的结点>&#xff0c;第一次遍历原链表结点时只创建新链表的结点&#xff0c;第二次遍历原链表结点时&#xff0c;通过键拿…

《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1 环境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix网络规划&#xff08;用你们自己的特征网段规划&#xff09; 主机名 IP 功能 备注 zbx6svr 19…

Opencv计算机视觉编程攻略-第四节 图直方图统计像素

Opencv计算机视觉编程攻略-第四节 图直方图统计像素 1.计算图像直方图2.基于查找表修改图像3.直方图均衡化4.直方图反向投影进行内容查找5.用均值平移法查找目标6.比较直方图搜索相似图像7.用积分图统计图像 1.计算图像直方图 图像统计直方图的概念 图像统计直方图是一种用于描…

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…

Mysql 索引性能分析

1.查看CRUD次数 show global status like Com_______&#xff08;7个下划线&#xff09; show global status like Com_______ 2.慢SQL分析 SET GLOBAL slow_query_log ON;-- 设置慢SQL日志记录开启 SET GLOBAL long_query_time 2; -- 设置执行超过 2 秒的查询为慢查询 开…