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

前言:

            看了很多博客以及视频讲解,感觉都不是很清楚,比较模棱两可,所以干脆自己一边想,一边写博客,也可帮助到其他人,都是根据自己的逻辑来尽量清楚简单的讲清楚题目,喜欢的不要吝啬三连,给博主点动力。

目录

1.奖券数目

2.星系炸弹

3.三羊献瑞

4.移动距离

5.垒骰子

6.生命之树


1.奖券数目

0奖券数目 - 蓝桥云课 (lanqiao.cn)

题目解析:

                就是判断每一位是否有4,将不含4的数进行累加。

#include <iostream>
using namespace std;bool is_four(int i)
{while(i > 0){int t = i % 10;if(t == 4)return false;i = i / 10;}return true;
}int main()
{int ret = 0;for(int i = 10000; i <= 99999; i++){if(is_four(i)){ret++;}}cout << ret << endl;return 0;
}

2.星系炸弹

0星系炸弹 - 蓝桥云课 (lanqiao.cn)

题目讲解:就是实现一个日期类;

#include<iostream>
using namespace std;class Date
{public:Date(int year, int month, int day): _year(year),_month(month),_day(day){}int getmonthday(int year, int month){int Month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int day = Month[month];//闰年情况;if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){day++;}return day;}Date& operator+=(int day){_day += day;//将day全部转化为年和月while(_day > getmonthday(_year, _month)){_day -= getmonthday(_year, _month);_month++;if(_month == 13){_year++;_month = 1;}}return *this;}void print(){cout << _year << _month << _day << endl;}private:int _year;int _month;int _day;
};int main()
{int year, month, day, addday;cin >> year >> month >> day >> addday;Date d1(year,month,day);d1 += addday;d1.print();return 0;
}

3.三羊献瑞

0三羊献瑞 - 蓝桥云课 (lanqiao.cn)

题目解析:这题本质就是模拟,根据题目意思依葫芦画瓢,然后进行全排列,得到最后答案。

题目说相同的汉字就是相同的数字,不相同反之。

如果使用到algorithm库函数里面的next_permutation就会很好做,那我们看看这个接口。

本质就是一个用来全排列的接口,但是前提是数组有序。可以将排列的数用下面图表示

#include <iostream>
#include<algorithm>
using namespace std;int main()
{//0-9个数字进行排列;int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int sum1 = 0, sum2 = 0, sum3 = 0;while(next_permutation(a, a + 10)){//细节处理if(a[0] != 0 && a[4] != 0){//处理算数sum1 = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];sum2 = a[4] * 1000 + a[5] * 100 + a[6] * 10 + a[1];sum3 = a[4] * 10000 + a[5] * 1000 + a[2] * 100 + a[1] * 10 + a[7];if(sum1 + sum2 == sum3){cout << a[4] << a[5] << a[6] << a[1];break;}}}return 0;
}

4.移动距离

0移动距离 - 蓝桥云课 (lanqiao.cn)

题目解析:本质就是考数学题目,算出m号房间和n号房间之间的距离,由于这个题目是按照Z字形来安置房间的。那么就会分为奇偶排楼的不同区别。

先来看房间的行号,row = m % w

列号就要分奇偶来划分了;注意这里列是从1开始排楼的。

偶数列发现是递减序列,我们可以根据找到第一个位置的房间号(行号*w)减去要找的房间号得到列号,下标从1开始还要+1. col = rol * w - m + 1;

奇数列是递增序列,先找到最后一个房间号(行号*w)减去找的房间号的差值,再用w为房间个数 - 差值就是列号。col = w - (rol * w -m +1);

#include <iostream>
using namespace std;int main()
{//先搞定输入;int w, m, n;cin >> w >> m >> n;int rowM = m % w == 0 ? m / w : m / w + 1;int rowN = n % w == 0 ? n / w : n / w + 1;int colM = 0, colN = 0;//偶数情况if(rowM % 2 == 0){colM =  rowM * w - m + 1;}else{colM = w - (rowM * w - m);}if(rowN % 2 == 0){colN =  rowN * w - n + 1;}else{colN = w - (rowN * w - n);}int sum = abs(colM - colN) + abs(rowM - rowN);cout << sum << endl; return 0;
}

5.垒骰子

0垒骰子 - 蓝桥云课 (lanqiao.cn)

题目解析:根据题目意思,下图,我们可以创建一个数组来记录每面的对面是什么,

题目解析: 首先就要创建一个冲突数组将骰子的正面和对面的冲突记录,以及冲突面的数组.还有因为想象一下是一个魔方,那么四个面都可以进行翻转.所以还要乘以4.
第一种代码只可以通过一个用例,因为dfs进行太多层那么就要优化.
#include<iostream>
using namespace std;const long long MOD = 1000000007;
int op[7];//记录对立面;
bool conflict[7][7];
int m, n;void init()
{op[1] = 4;op[2] = 5;op[3] = 6;op[4] = 1;op[5] = 2;op[6] = 3;
}long long int f(int up, int n)
{if(n == 0)return 4;long long int ans = 0;for(int uup = 1; uup <= 6; uup++){if(conflict[op[up]][uup])continue;ans = (ans +  f(uup, n -1)) % MOD;}return ans;
}int main()
{init();cin >> n >> m;for(int i = 0; i < m; i++){int a, b;cin >> a >> b;conflict[a][b] = true;conflict[b][a] = true;}long long int  ans = 0;for(int up = 1; up <= 6; up++){ans = (ans + 4 * f(up, n -1)) % MOD;}cout << ans << endl;return 0;
}

 使用第二种方法是动态规划.dp[i][j]表示有i层,限定朝上的数字为j的稳定方案数.

#include<iostream>
#include<map>
#include<cmath>
using namespace std;
long long dp[2][7];//dp[i][j]表示有i层,限定朝上的数字为j的稳定方案数
#define mod 1000000007
//int op[7];//记录对立面
bool  conflict[7][7];//判断是否冲突
map<int, int>op;
int n, m;
void Init()
{op[1] = 4;op[2] = 5;op[3] = 6;op[4] = 1;op[5] = 2;op[6] = 3;
}
int main()
{Init();cin >> n >> m;int x, y;long long ants = 0;for (int i = 0; i < m; i++){cin >> x >> y;conflict[x][y] = true;conflict[y][x] = true;}//输入完成for (int j = 1; j <= 6; j++){dp[0][j] = 1;}int cur = 0;//迭代层数for (int level = 2; level <= n; level++){cur = 1 - cur;//尝试把6个面放在当前一层朝上的方向for (int j = 1; j <= 6; j++){dp[cur][j] = 0;//将与op[j]不冲突的上一层格子里面的数累加起来for (int i = 1; i <= 6; i++){if (conflict[op[j]][i])continue;//冲突的面朝上是不可取的dp[cur][j] = (dp[cur][j] + dp[1 - cur][i]) % mod;}}}long long sum = 0;for (int k = 1; k <= 6; k++){sum = (sum + dp[cur][k] )% mod;}//快速冥求4的次方long long ans = pow(4, n);cout << (sum * ans) % mod << endl;return 0;
}

6.生命之树

0生命之树 - 蓝桥云课 (lanqiao.cn)

 题目解析:采用动态dp, dp[i][2]表示i结点选和不选情况下最大评分.

dp表的初始化,dp[i][1] = i 结点的权值.dp[i][0] = 0; 并且标记一下这个结点已经被使用过了.

dp[i][1] 分两个情况一个就是当前结点没有被使用过那么就是dp[i][1] = max(dp[i][0],dp[联通i结点][1]);

已经使用过,那么就是dp[i][1] = max(dp[i][1], 结点的权值); dp[i][0] = max(dp[i][0], 0);

#include <iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<cstring>
#define N 100000int n;
vector<int> node[N];//标记结点
int vis[N];//结点标记
int a, b;
int dp[N][2];//表示i结点选和不选的最大评分.
int v[N];//权值void init()
{memset(v, 0, sizeof(v));memset(dp, 0, sizeof(dp));cin >> n;for(int i = 1; i <= n; i++)//下标从1开始{cin >> v[i];}for(int i = 1; i < n; i++){cin >> a >> b;//结点连通node[a].push_back(b);node[b].push_back(a);}
}void dfs(int pos)
{//初始化.dp[pos][1] = v[pos];dp[pos][0] = 0;vis[pos] = 1;//结点连接数for(int i = 0; i < node[pos].size(); i++){if(!vis[node[pos][i]])//没被使用过{//递归相邻结点.dfs(node[pos][i]);dp[pos][1] += max(dp[node[pos][i]][0], dp[node[pos][i]][1]);}else{dp[pos][1] = max(dp[pos][1], v[pos]);dp[pos][0] = max(dp[pos][0], 0); }}
}int main()
{init();dfs(1);int ans = -1;//可能有负数for(int i = 1; i <= n; i++){ans = max(ans, dp[i][0]);ans = max(ans, dp[i][1]);}cout << ans << endl;return 0;
}

xdm给卑微的博主上上三联, 谢谢大家,一起进步学习!!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt实现Kermit协议(四)

3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下&#xff1a; 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…

ezuikit.js加载flv格式链接报错问题

报错信息如下&#xff1a; 解决方法&#xff1a; 添加依赖 "flv.js": "^1.5.0", 在main.js或app.ts里面 加上 window.flvjs require(flv.js/dist/flv); 就可以成功运行了

消息队列MQ(面试题:为什么使用MQ)

一、什么是mq? MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信&#xff0c;解耦。 二、常见的mq产品 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq RabbitMQ: One broker …

flask接口返回文本、json、图片格式

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

计算机的发展趋势

本文 我们来说计算机的发展趋势 目前来讲 计算机是朝着 巨型化 微型化 网络化 智能化发展 巨型化 指功能巨型化 是指其高速运算、大存储容量和强功能的巨型计算机。其运算能力一般在每秒百亿次以上、内存容量在几百兆字节以上。 主要用于航空航天、军事、气象、人工智能、生…

数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树&#xff1a;对于二叉搜索树中的每个结点&#xff0c;其左子结点的值小于该结点的值&#xff0c;而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…

基于单片机16路多路抢答器仿真系统设计

**单片机设计介绍&#xff0c;基于单片机16路多路抢答器仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机16路多路抢答器仿真系统的设计概要主要涵盖硬件设计、软件编程以及功能实现等方面。以下是针对该设计的详细概…

RA8900CE计时芯片介绍及开发方案

计时芯片 就是一个需要连接32.768k晶振的RTC芯片 规格书阅读 首先我们先读懂这个芯片是怎么用的。 引脚表 封装是这样的&#xff0c;一共10个引脚。 基本上一看这个引脚表就知道大概。 T1和T2是工厂测试的&#xff0c;不用管。 SCL和SDA是IIC通讯用的。 FOUT和FOE就是链…

GD32F470_GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm模块移植

2.4 红外测距传感器 GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(position sensitive detector)和IRED(infrared emitting diode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电…

线段树和树状数组

实战演练 1.【模板】树状数【模板】树状数组1 输入&#xff1a; 5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 注意&#xff1a;只修改一个数&#xff08;单点修改&#xff09;&#xff0c;却要输出一个区间的值&#xff08;区间查询&#xff09;&#xff01;&#xff…

FreeRTOS学习 -- 再识

工作中一直使用FreeRTOS进行着开发&#xff0c;但是没有进行过系统的总结过。现在将快速使用几天时间将FreeRTOS相关知识点加以总结。 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 参看资料&#xff1a; 正点原子 STM32F1 FreeRTOS开发手册_V1.2.pdf The FreeRTOS…

LangChain入门:15.Sequential Chain:顺序链的使用

Sequential Chain是LangChain库中的一个强大工具&#xff0c;它允许我们将多个LLMChain按照特定的顺序连接起来&#xff0c;形成一个处理流程。这种链式结构使得我们可以将一个大任务分解为几个小任务&#xff0c;并依次执行&#xff0c;每个任务的输出成为下一个任务的输入。 …