蓝桥杯第十三届c++大学B组详解

2024-04-12 04:20

本文主要是介绍蓝桥杯第十三届c++大学B组详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.九进制转十进制

2.顺子日期

3.刷题统计

4.修剪灌木

5.x进制的减法

6.统计子矩阵

7.积木画

8.扫雷

9.李白打酒

10.砍竹子


1.九进制转换十进制

题目解析:就是将2022的每一位拿出来乘以9的n-1次方的和就是最终答案。次方是从0开始的到n-1.

#include <iostream>
using namespace std;int pow(int a, int b)
{int ret = 1;if(b == 0)return 1;else{while(b--){ret *= a;}}return ret;
}int main()
{int n = 2022;int change = 0;for(int i = 0; i <= 3; i++){int t = n % 10;change += pow(9, i) * t;n /= 10;}cout << change << endl;return 0;
}

2.顺子日期

 题目解析:这个题目手算也很快.

012 123 234 345...

因为月日的要求只能有012 和123;

那么就只要将数字全部转变为字符串,然后再找上面两个字符存不存在就可以确定了。

#include <iostream>
#include<string>
using namespace std;bool check(int year, int month, int day)
{string str = to_string(year);if(month < 10) str += '0';str += to_string(month);if(day < 10)str += '0';str += to_string(day);return (str.find("012") != -1 || str.find("123") != -1);
}int main()
{int year = 2022;int ans = 0;int Month[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};for(int month = 1; month <= 12; month++){for(int day = 1; day <= Month[month]; day++){if(check(year, month, day)){ans++;}}}cout << ans << endl;return 0;
}

3.刷题统计

 题目解析:题目比较简单,就是加和加上判断。最后返回日期即可。

#include <iostream>
using namespace std;int main()
{long long  a, b, n;cin >> a >> b >> n;long long sum = 0;long long day = 0;while(1){ if(sum >= n){cout << day << endl;return 0;}for(int i = 1; i <= 7; i++){if(sum >= n){cout << day << endl;return 0;}if(i >= 1 && i <= 5){sum += a;}else{sum += b;}day++;}}return 0;
}

 后面想了一下只过了6个用例,那么就是数据肯定太大,处理出错了.

 

#include <iostream>
using namespace std;int main()
{long long a, b, n;cin >> a >> b >> n;long long week = a * 5 + b * 2;//一周做题量long long num = (n / week) * week;//花费周数的做题量;long long day = (n / week) * 7;//花费天数.while(n - num > 0){if(day % 7 < 5)num += a;elsenum += b;day++;}cout << day << endl;return 0;
}

4.修剪灌木

 题目解析:这个题目;自己可以写几个看看规律。

每次剪树的移动时间就会给树的生长提供时间间隙;

那么就可以分三种情况:

1.从左到右边进行剪第一次,那么就是从开始剪的地方到现在剪的地方的天数就是可以长高的高度就是i。

2.从左到右边再从右边拐到左边剪,那么就是 i, i + 1, i + 2, ..., n, n -1 , n - 2, ...., i;

那么生长高度就是2*(n - i);

3.从右边到左边再拐到右边剪,那么就是  i - 1, i -2, i -3 ..., 1, 2, ..., i;

那么生长的高度就是2(i - 1);

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

5.x进制的减法

 题目解析:可以参考一下这篇博客,暂时我还没想到这个题目如何写.

X 进制减法 — 蓝桥杯E题_x进制减法 100 【题目描述】 进制规定了数字在数位上逢几进一。 x 进制是一种-CSDN博客

 

#include<iostream>
#include<algorithm>using namespace std;const int N = 1e5 + 10,MOD = 1e9 + 7;int n,m1,m2,m;
int a[N],b[N];int main(){cin >> n >> m1;for(int i = m1 - 1;i >= 0;i --) cin >> a[i];cin >> m2;for(int i = m2 - 1;i >= 0;i --) cin >> b[i];int m = max(m1,m2);int res = 0;for(int i = m;i >= 0;i --){res = (res * (long long)(max({2,a[i] + 1,b[i] + 1})) + a[i] - b[i]) % MOD;}cout << res << endl;return 0;
}

6.统计子矩阵

 题目解析:

 6.统计子矩阵:

 题目解析:前缀和+双指针,将原矩阵加和得到sum矩阵,然后使用双指针进行矩阵的值判断.

例子:

3 4 10

1 2 3 4

5 6 7 8

9 10 11 12

sum矩阵:

1 2 3 4 

6 8 10 12

15 18 21  24

使用双指针 L 和R 进行遍历矩阵范围的控制.最好自己画一下图更好理解上手,然后去写代码

#include<iostream>
using namespace std;#define maxn 505
int a[maxn][maxn];
int sum[maxn][maxn];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];sum[i][j] = a[i][j] + sum[i - 1][j];}}long long m_cout = 0;for(int x = 1; x <= n; x++){for(int y = x; y <= n; y++){for(int r = 1, l = 1, s = 0; r <= m; r++){s += sum[y][r] - sum[x - 1][r];while(s > k && l < r){s = s - sum[y][l] + sum[x - 1][l];l++;}if(s <= k){m_cout += r - l + 1;}}}}cout << m_cout << endl;return 0;
}

7.积木画

 题目解析:动态dp解决,要画图更好理解.

dp[i][4]:

dp[i][0]: 表示积木第i列的上下都没有堆积木;

dp[i][1]: 表示积木第i列的上面没有堆积木,下面摆放了积木;

dp[i][2]: 表示积木第i列的下面没有堆积木,上面摆了积木;

dp[i][3]:表示积木第i列的上下都摆放了堆积木;

那我们来看状态方程如何推导:

首先初始化:

当n == 0;dp[0][3] = 1可以理解为全部摆放好了;

当n == 1; dp[1][3] = 1;只有一种摆放方式;

dp[i][0]推导:

那么前面的i -1 一定是以及摆放好的了;所以

dp[i][0] = dp[i - 1][3];

然后就是dp[i][1]:

有下面两种情况:

dp[i][1] = dp[i - 1][0] + dp[i -1][2];

dp[i][2]:

dp[i][2] = dp[i - 1][0] + dp[i - 1][ 1];

dp[i][3]:

dp[i][3] = dp[i - 2][3] + dp[i -1][3] + dp[i - 1][2] +dp[i - 1][1];

 

#include<iostream>
using namespace std;
#define N 10000001
#define MOD 1000000007int n;
long long dp[N][3];void slove()
{cin >> n;dp[0][3] = 1;dp[1][3] = 1;for(int i = 2; i <= n; i++){dp[i][0] = dp[i - 1][3];dp[i][1] = (dp[i - 1][0] + dp[i -1][2]) % MOD;dp[i][2] = (dp[i - 1][0] + dp[i - 1][ 1]) % MOD;dp[i][3] = ((dp[i - 2][3] + dp[i -1][3]) % MOD + (dp[i - 1][2] +dp[i - 1][1]) % MOD) % MOD;}cout << dp[n][3] << endl;
}int main()
{slove();return 0;
}

8.扫雷

 题目解析:这个题目一看就是要使用到dfs深搜

 

#include <iostream>
using namespace std;int n, m;
int a[102][102] = {0};
int dx[8] = {0, 0, -1, 1, -1, -1, 1, 1};
int dy[8] = {-1, 1, 0, 0, -1, 1, -1, 1};
int vis[102][102] = {0};void dfs(int x, int y)
{if(x > n && y > m)return;vis[x][y] = 1;for(int k = 0; k < 8; k++){int xx = dx[k] + x;int yy = dy[k] + y;if(xx >= 1 && x <= n && yy >= 1 && yy <= m){if(a[xx][yy] = 1 && vis[xx][yy] == 0){a[x][y] += a[xx][yy];vis[xx][yy] = 1;dfs(x + 1, y + 1);}}}
}int main()
{cin >> n >> m;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> a[i][j];}}dfs(1, 1);for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cout << a[i][j];}cout << endl;}return 0;
}

9.李白打酒

 题目解析:又是动态dp,dp[i][j][k]表示遇到第i个店第j个花酒剩下k斗酒的方案数;

初始化: dp[0][0][2] = 1;

当最后一次遇到的是店,动态方程就是 dp[i][j][k] = dp[i][j][k] + dp[i-1][j][k / 2];

因为喝酒的数目和遇到花的次数挂钩,那么最少酒的斗数就是遇到花的次数.

最后一次遇到的是花,那么酒的数量一定要大于大于1;

 那么就是dp[i][j][k] = dp[i][j - 1][k + 1];

需要注意最后返回的是dp[n][m - 1][1];因为最后一次遇到花之前必须是至少还剩下一斗酒.

 

#include <iostream>
using namespace std;
#define N 101long long dp[N][N][N];int main()
{int n, m;cin >> n >> m;dp[0][0][2] = 1;for(int i = 0; i <= n; i++){for(int j = 0; j <= m; j++){for(int k = 0; k <= m; k++){if(i && k % 2 == 0)//遇到店;dp[i][j][k] = dp[i][j][k] + dp[i - 1][j][k / 2];if(j)//遇到花dp[i][j][k] = dp[i][j][k] + dp[i][j - 1][k + 1];}}}cout << dp[n][m - 1][1] << endl;return 0;
}

10.砍竹子

 题目解析:这个题目用到贪心,暴力;将竹子用魔法公式进行处理,但是如果竹子的长度一样就可以一起砍.得到的次数是一样的.

#include <iostream>
using namespace std;
#include<vector>
#define N 200000
#include<cmath>int n;
vector<long long> e[N]; int main()
{cin >> n;vector<long long> a(n);for(auto& x : a)cin >> x;long long ans = 0;for(int i = 0; i < n; i++){long long tmp = a[i];while(tmp > 1){e[i].push_back(tmp);tmp = sqrt(tmp / 2 + 1);ans++;}}for(int i = 1; i < n; i++){for(long long x : e[i - 1]){for(long long tmp : e[i]){if(x == tmp)ans--;}}}cout << ans << endl;return 0;
}

这篇关于蓝桥杯第十三届c++大学B组详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896087

相关文章

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo