蓝桥杯第十三届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

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I