草庐IT

2022年蓝桥杯C++B组题解 - 很详细

The小可 2023-04-17 原文

本人这次侥幸省1,特做题解复习,哈哈哈…

1.进制转换(5分):

问题描述:

直接计算 2 + 2 * 9 + 2 * 9 * 9 * 9

答案: 1478

2.顺子日期(5分)

这题有争议: 主要在于0等不能开头:如 20220121

本人认为0不能作为开头 (因为例题中20220123 说明的顺子为123并不是012):

所以顺子日期有: 20220123 20221123 20221230 20221231

答案 :4

3.刷题统计(10分)

解题思路:

  1. 考虑 a=1,b=1,n=1e18 情况,不能一天一天计算,会超时
  2. 5 * a+2 * b 为一周的刷题量,先除法计算多少周,
  3. 剩余的天数一直减就是了
  4. if (n <= 0)break; 要放在第一位

参考代码:

#include<iostream>
using namespace std;
int main()
{
    long long a, b, n;
    cin >> a >> b >> n;
    long long day = 0;
    long long t = n / (5 * a + 2 * b);
    day += t * 7;  //先算多少周
    n = n % (5 * a + 2 * b);
    for (int i = 1; i <= 7; i++) { //再算天数
        if (n <= 0)break;
        if (i > 5)n -= b;
        else n -= a;       
        day++;       
    }
    cout << day;
    return 0;
}

4.修剪灌木(10分)

思路:

  1. 对于每一个点都需要考虑 距离1端点的距离 和 n端点的距离
  2. 因为来回剪,所以需要将距离 * 2
  3. 再取两者大值即可
  4. 最后特判 1的情况

参考代码:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    if (n == 1) {
        cout << 1 << endl;
        return 0;
    }
    for (int i = 1; i <= n; i++) {
        cout << max(2 * (i - 1), 2 * (n - i))<< endl;
    }
}

5.X进制减法(15分)


算法 : 简单的贪心

先分析一下题干的65是怎么出来的:

  • 第一数位每一个数代表的必然是1
  • 第二数位是由第一数位的二进制上来的,所以第二数位每一个数代表的是2
  • 第三数位是由第二数位十进制进位上来的,所以第三数位每一个数代表的是2 * 10 = 20

所以 : X(321) = 3 * 20 + 2 * 2 + 1 * 1 = 65;

参考代码:

#include<iostream>
using namespace std;
const int N = 1e5 + 10,MOD=1e9+7;
int a[N], b[N];
int n, ma, mb;
int main()
{
	cin >> n;
	cin >> ma;
	for (int i = ma - 1; i >= 0; i--)cin >> a[i];
	cin >> mb;
	for (int i = mb - 1; i >= 0; i--)cin >> b[i];

	long long t = 1; //到每一个的底数
	long long ans=0;
	for (int i = 0; i < ma; i++) {
		int c = max(a[i], b[i]) + 1;  //贪心取得最小的进制
		if (c < 2)c = 2;  //最小为2进制
		ans = (ans+(a[i] - b[i]) * t)%MOD;
		t = (t * c) % MOD;  
	}
	cout<<ans;
}

6.统计子矩阵(15分)

算法 :二维前缀和

注意 : 理论上朴素前缀和,在100%的数据上会超时 ,需要优化,只需不重复计算子矩阵就行

#include<iostream>
using namespace std;
const int N = 510;
int g[N][N];
int n, m, k;
int main()
{
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> g[i][j];
			g[i][j] += g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1];
		}
	}
	/*
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cout << g[i][j] << " ";
		}
		cout << endl;
	}*/
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			for (int x = i; x <= n; x++) {
				for (int y = j; y <= m; y++) {
					if (g[x][y] - g[x][j - 1] - g[i - 1][y] + g[i - 1][y - 1] <= k)ans++;
				}
			}
		}
	}
	cout << ans;
}

7.积木画(20分)

算法 : 动态规划

思路 :

转换方程 : dp[i] 由 dp[i-1] , dp[i-2], dp[i-3] 状态转换过来

  1. 由dp[i-1] 转到 dp[i] 只有一种可能

所以 dp[i] = dp[i-1] * 1

  1. 由dp[i-2] 转到 dp[i] 只有一种可能(需要排除1中的情况)

所以 dp[i] = dp[i-2] * 1

  1. 由 dp[i-3] 转到 dp[i] 有两种可能(需要排除1,2 的情况)

所以 dp[i] = dp[i-3] * 2

综上 : dp[i] = dp[i-1] + dp[i-2] +dp[i-3] * 2

初始状态 : dp[0] = 1 , dp[1] = 1 , dp[2] = 2

最终状态转移方程 : dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3] * 2)%MOD;

参考代码:

#include <iostream>
using namespace std;
const int N = 1e7 + 4, MOD = 1000000007;
int dp[N];  //dp[i]表示长度为i有dp[i]个拼法
int n;
int main() {
    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] + dp[i - 3] * 2)%MOD;
    }
    cout << dp[n] ;
    return 0;
}

8.扫雷(20分)


算法 :DFS

思路 :

  1. 被引爆的地雷可以认为是一颗排雷火箭
  2. 每颗排雷火箭引爆,都遍历一下全部地雷,若在范围内,则将这颗雷引爆
  3. 引爆了的雷需要标记一下,防止重复引爆

参考代码:

#include <iostream>
using namespace std;
const int N = 50010;
struct Node {
    int x, y, r;
};
int n, m,ans=0;
Node mine[N];
bool visited[N];
Node rocket[N];
bool compare(Node a, Node b) {
    long xx = (a.x-b.x) * (a.x - b.x);
    long yy = (a.y-b.y) * (a.y - b.y);
    return sqrt(xx+yy) <= a.r;
}
void boom(Node node) {

    for (int i = 0; i < n; i++) {
        if (visited[i])continue;
        if (compare(node, mine[i])) {
            visited[i] = true;
            ans++;
            boom(mine[i]);
        }
    }
}
int main() {
    cin >> n >> m;
    int x, y, r;
    for (int i = 0; i < n; i++) {
        cin >> x >> y >> r;
        mine[i] = { x,y,r };
    }
    for (int i = 0; i < m; i++) {
        cin >> x >> y >> r;
        rocket[i] = { x,y,r };
    }
    for (int i = 0; i < m; i++) {
        boom(rocket[i]);
    }
    cout << ans;
    return 0;
}

9.李白打酒加强版

算法 : 动态规划

状态表示:f[i][j][k] 表示访问前i个位置时,恰好访问j个店并且酒量恰好为k的时候的方案数;

状态转移

  1. 看花 : f[i][j][k] = f[i-1][j-1][k+1]
  2. 遇店 : f[i][j][k] = f[i-1][j][k/2];

起始状态 :f[0][0][2] 刚开始2斗酒

注意:

  • 看花时,需要保证 j>1 (不可能在上一次zhi前看完了花,这次还看花)
  • 看店时 需要保证这是酒的数量是偶数,因为加倍永远是偶数

参考代码:

#include <iostream>
using namespace std;
const int N = 110,MOD = 1e9+7;
int n, m;
int f[2*N][N][N];  //f[i][j][k] 表示在第i个位置(共有 n+m个位置),遇到j个花,目前还剩 k斗酒
int main() {
    cin >> n >> m;
    f[0][0][2] = 1;
    for (int i = 1; i <= n + m; i++) {
        for (int j = 0; j <= m; j++) {
            for (int k = 0; k <= m; k++) {  //酒的最大数量为m,如果大于m,就算后面的全是花也喝不完酒
                //遇到花
                if(j>=1) f[i][j][k] =f[i - 1][j - 1][k + 1];
                //遇到酒
                if (k % 2 == 0) {  //
                    f[i][j][k] = (f[i][j][k]+f[i - 1][j][k / 2])%MOD;
                }
            }
        }
    }
    cout << f[n + m - 1][m - 1][1];
    return 0;
}

10.砍竹子

先做前面的,没做出来!!!!

最后总结:

蓝桥杯已经变了,不再是以前的暴力杯了,考验的更是思维,dfs和动态规划将成为常客。以后的小伙伴要多刷题,刷题,刷题!!!

创作不易,望小伙伴萌来波3连!!!!预祝各位下次省1 !!!

有关2022年蓝桥杯C++B组题解 - 很详细的更多相关文章

  1. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  4. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  5. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  6. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  7. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  8. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  9. Anaconda3、TensorFlow和keras简单安装方法(较详细) - 2

    因学习需要用到keras,通过查找较多资料最终完成Anaconda、TensorFlow和Keras的简单安装。因为网上的相关资料较多但大部分不够全面,查找起来不太方便,因此自己记录一下成功下载安装的详细过程,顺便推荐一下借鉴的写的很好的相关教程文章。keras需要在TensorFlow之上才能运行,所以要先安装TensorFlow,而TensorFlow只能在3.7以前的python版本中运行,所以需要先创建一个基于python3.6的虚拟环境,因此便需要先下载Anaconda。一、Anaconda3下载和安装Anaconda下载安装教程原文链接:https://blog.csdn.net/

  10. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

随机推荐