蓝桥杯(更新中)

递归与递推

递归

1.指数型枚举

解析:从 1 ∼ n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

思路:枚举每一位对应的数字选与不选,例如:第一位对应的数字为1,有一种方案是选1,另外一种方案是不选

AcWing 92. 递归实现指数型枚举

#include <iostream>
#include <algorithm>using namespace std;const int N = 20;
int n;
bool st[N];
void dfs(int u)
{if (u > n){for (int i = 1; i <= n; i ++){if (st[i]) cout << i << ' ';}cout << endl;return ; //选完三个数,回溯}//选当前位置所对应的数st[u] = true; //选的数标记为truedfs(u + 1); //递归到下一位//不选当前位置所对应的数st[u] = false;dfs(u + 1);
}
int main()
{cin >> n;dfs(1);return 0;
}

2.排列形枚举

解析:把 1 ∼ n 这 n 个整数排成一行后随机打乱顺序

思路:考虑每一位可以填哪几个数,用过的数字需要标记

AcWing 94. 递归实现排列型枚举  

#include <algorithm>
#include <iostream>using namespace std;const int N = 20;
int n;
int path[N], cnt;
bool st[N];void dfs(int u)
{if (u > n){for (int i = 1; i <= n; i ++)cout << path[i] << ' ';cout << endl;return; //回溯}for (int i = 1; i <= n; i ++){if (!st[i]){path[u] = i;st[i] = true; //标记dfs(u + 1);st[i] = false; //恢复现场}}
}
int main()
{cin >> n;dfs(1);return 0;
}

3.组合型枚举

解析:从 1∼n 这 n个整数中随机选出 m个,输出所有可能的选择方案。

思路:画一棵递归搜索树

AcWing 93. 递归实现组合型枚举   

输入样例:

5 3

输出样例:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 
#include <iostream>using namespace std;const int N = 50;
int path[N];
bool st[N];
int n, m;void dfs(int u, int last)
{//剪枝:当可填入数字小于当前空缺的位数时if (n - last < m - u) return;//当所有位数全部填满,输出结果,回溯if (u > m){for (int i = 1; i <= m; i ++) printf("%d ", path[i]);puts("");return;}//填入数字for (int i = last; i <= n; i ++){if (!st[i]){path[u] = i;st[i] = true;dfs(u + 1, i);st[i] = false; //恢复现场}}
}
int main()
{scanf("%d%d", &n, &m);dfs(1, 1);return 0;
}

 


 递推

斐波那契

解析:其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定z义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)

AcWing 717. 简单斐波那契

#include <iostream>
#include <algorithm>using namespace std;const int N = 50;
int n, a[N];int main()
{cin >> n;if (n == 1) cout << "0" << endl;else{a[0] = 0;a[1] = 1;cout << a[0] << ' ' << a[1];for (int i = 2; i < n; i ++){a[i] = a[i - 1] + a[i - 2];cout << ' ' << a[i];}cout << endl;}return 0;
}

习题: 

费解的开关

解析:每一盏灯都有两种选择 : 按或者不按。

            通过递推发现规律:1. 当第一行的操作方案确定时,剩余行的操作方案也确定了

                                             2.前一行的状态影响下一行的操作

举例:

假设第一行选择某一种方案进行操作后的状态如图所示:

第一行的状态决定了第二行的操作(要使得第一行灯灭的格子变亮,就必须对该格子下方的方格进行操作):

 

操作完成后第一行的格子全亮 

以此类推......

思路:

1.枚举第一行格子的每一种操作方案

2.枚举前四行的状态,操作下一行,使得前四行的格子全亮

3.判断最后一行格子是否全亮

题目:

你玩过“拉灯”游戏吗?

25盏灯排成一个 5×5 的方形。

每一个灯都有一个开关,游戏者可以改变它的状态。

每一步,游戏者可以改变某一个灯的状态。

游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯

给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮

输入格式

第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。

以下若干行数据分为 n组,每组数据有 5 行,每行 5 个字符。

每组数据描述了一个游戏的初始状态。

各组数据间用一个空行分隔。

输出格式

一共输出 n 行数据,每行有一个小于等于 6 的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。

对于某一个游戏初始状态,若 6 步以内无法使所有灯变亮,则输出 −1

数据范围

0<n≤500

输入样例:

3
00111
01011
10001
11010
1110011101
11101
11110
11111
1111101111
11111
11111
11111
11111

输出样例:

3
2
-1
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 10;
int n;
int g[N][N], backup[N][N];
string s[N];
int dx[] = {0, 1, -1, 0 , 0};
int dy[] = {0, 0, 0, 1, -1};void turn(int x, int y)
{for (int i = 0; i < 5; i ++){int a = x + dx[i], b = y + dy[i];if (a >= 0 && a < 5 && b >= 0 && b < 5){if (g[a][b] == 0) g[a][b] = 1;else g[a][b] = 0;}}
}
int main()
{scanf ("%d", &n);while (n --){int res = 10;for (int i = 0; i < 5; i ++) cin >> s[i];for (int i = 0; i < 5; i ++)for (int j = 0; j < 5; j ++)g[i][j] = s[i][j] - '0';for (int op = 0; op < 32; op ++){memcpy(backup, g, sizeof g);int step = 0;for (int i = 0; i < 5; i ++){if (op >> i & 1){step ++;turn(0, i);}}for (int i = 0; i < 4; i ++){for (int j = 0; j < 5; j ++){if (g[i][j] == 0){step ++;turn(i + 1, j);}}}bool dark = false;for (int i = 0; i < 5; i ++){if (g[4][i] == 0){dark = true;break;}}if (!dark) res = min(res, step);memcpy(g, backup, sizeof backup);}if (res > 6) res = -1;cout << res << endl;}
}

AcWing 1209. 带分数

解析:  n = a + b / c 

             经过变形得:b = nc - ac

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 10;
bool st[N], backup[N];
int n, ans;
//n = a + b / c
//b = nc - ac//判断a, b, c是否满足要求
bool check(int a, int c)
{long long b = n * (long long)c - a * c;if (!a || !b || !c) return false;memcpy(backup, st, sizeof st);while (b){int x = b % 10;b /= 10;if (!x || backup[x]) return false;backup[x] = true;}for (int i = 1; i <= 9; i ++)if (!backup[i]) return false;return true;
}
void dfs_c(int u, int a, int c)
{if (u > 9) return;if (check(a, c)) ans ++;for (int i = 1; i <= 9; i ++){if (!st[i]){st[i] = true;dfs_c(u + 1, a, c * 10 + i);st[i] = false;}}
}
//u当前用了几位数 当前a为多少
void dfs_a(int u, int a)
{if (a >= n) return;if (a) dfs_c(u, a, 0);for (int i = 1; i <= 9; i ++){if (!st[i]){st[i] = true;dfs_a(u + 1, a * 10 + i);st[i] = false;}}
}
int main()
{scanf("%d", &n);dfs_a(0, 0); //dfs_a(u, a);printf("%d\n", ans);return 0;
}

AcWing 116. 飞行员兄弟 

输入样例:

-+--
----
----
-+--

输出样例:

6
1 1
1 3
1 4
4 1
4 3
4 4
 分析:

        类似于费解的开关:初始状态为4 * 4, 对于这16个可操作的位置,每一个位置可选方案为两种,一共有2^16种操作方案,枚举这2^16种方案

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;typedef pair<int, int> PII;
const int N = 10;
char g[N][N], backup[N][N];
vector<PII> ans;
void turn(int x, int y)
{for (int i = 0; i < 4; i ++){if (g[x][i] == '+') g[x][i] = '-';else g[x][i] = '+';if (g[i][y] == '+') g[i][y] = '-';else g[i][y] = '+';}if (g[x][y] == '+') g[x][y] = '-';else if (g[x][y] == '-') g[x][y] = '+';
}
int main()
{for (int i = 0; i < 4; i ++) scanf("%s", g[i]);for (int op = 0; op < (1 << 16); op ++){memcpy(backup, g, sizeof g);vector<PII> tmp;int step = 0;for (int i = 0; i < 4; i ++){for (int j = 0; j < 4; j ++){int x = i * 4 + j;if (op >> x & 1){turn(i, j);tmp.push_back({i + 1, j + 1});step ++;}}}bool flag = true;for (int i = 0; i < 4; i ++){for (int j = 0; j < 4; j ++){if (g[i][j] == '+'){flag = false;}}}if (flag){if (ans.empty() || tmp.size() < ans.size()){ans = tmp;}}memcpy(g, backup, sizeof g);}cout << ans.size() << endl;for (auto it : ans) cout << it.first << ' ' << it.second << endl;
}


二分与前缀和

二分查找

图解分析:

模板:
从左边开始找:
int l = 0;
int r = n - 1;
while (l < r)
{int mid = (l + r) / 2;if (a[mid] >= x) r = mid;else l = mid + 1;
}
从右边开始找: 
l = 0;
r = n - 1;
while(l < r)
{int mid = (l + r + 1) / 2;if (a[mid] <= x) l = mid;else r = mid - 1;
}

大概思路:

        根据a[mid]与x的大小关系,不断更新左右区间

 二分例题:

AcWing 1221. 四平方和  

思路:

          1.先枚举c和d,将c和d的结果用一个结构体存储起来

          2.再枚举a和b,在存储的结构体数组中查找与a和b互补的结果

注意:结构体数组要按字典序排列,必须从小到大依次排好,只有这样,查找到的第一个结果是按字典序排列的

代码:
#include <iostream>
#include <algorithm>using namespace std;const int N = 25000010;int cnt;
struct Sum {int s, c, d;bool operator < (const Sum &t)const{if (s != t.s) return s < t.s;if (c != t.c) return c < t.c;return d < t.d;}
}sum[N];int main()
{int n;scanf("%d", &n);for (int c = 0; c * c <= n; c ++){for (int d = c; c * c + d * d <= n; d ++){sum[cnt ++] = {c * c + d * d, c, d};}}sort(sum, sum + cnt);for (int a = 0; a * a <= n; a ++){for (int b = a; a * a + b * b <= n; b ++){int t = n - (a * a + b * b);int l = 0, r = cnt - 1;while (l < r){int mid = (l + r) / 2;if (sum[mid].s >= t) r = mid;else l = mid + 1;}if (sum[l].s == t){printf("%d %d %d %d\n", a, b, sum[l].c, sum[l].d);return 0;}}}
}

前缀和:

一维前缀和:

图解分析:

模板:
int n, m;
int sum[N];
void Prefix_and(int a[])
{for (int i = 1; i <= n; i ++ )  sum[i] = sum[i - 1] + a[i];
}
int Sum(int l, int r)
{return sum[r] - sum[l - 1];
}
一维前缀和例题(C++版):
Acwing795.前缀和

#include <iostream>using namespace std;const int N = 100010;int n, m;
int sum[N];
void Prefix_and(int a[])
{for (int i = 1; i <= n; i ++ )  sum[i] = sum[i - 1] + a[i];
}
int Sum(int l, int r)
{return sum[r] - sum[l - 1];
}
int main()
{cin >> n >> m;int a[N];for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);Prefix_and(a);while (m --){int l, r;cin >> l >> r;cout << Sum(l, r) << endl;;}
}

二维前缀和:

图解分析:

模板:
int n, m;
int sum[N][N];
void Prefix_and(int a[N][N])
{for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
}
int Sum(int x1, int y1, int x2, int y2)
{int res = sum[x2][y2] - sum[x2][y1 - 1] - sum[x1 - 1][y2] + sum[x1 - 1][y1 - 1];return res;
}
二维前缀和例题(C++版):
Acwing796.子矩阵的和

#include <iostream>using namespace std;const int N = 1010;
int n, m;
int sum[N][N];
void Prefix_and(int a[N][N])
{for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
}
int Sum(int x1, int y1, int x2, int y2)
{int res = sum[x2][y2] - sum[x2][y1 - 1] - sum[x1 - 1][y2] + sum[x1 - 1][y1 - 1];return res;
}
int main()
{int q;cin >> n >> m >> q;int a[N][N];for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ )cin >> a[i][j];Prefix_and(a);while (q --){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;cout << Sum(x1, y1, x2, y2) << endl;}
}



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

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

相关文章

Gitea的简单介绍

1、Gitea&#xff08;Gitea - 轻量级全功能 DevSecOps 平台&#xff09; Gitea 是一个基于 Go 语言编写的轻量级、开源、自托管的 Git 服务软件&#xff0c;它的设计目标是易于安装、快速运行并且提供出色的用户体验。Gitea 提供了一个类似于 GitHub 或 GitLab 的 web 界面&…

ZKFair 步入Dargon Slayer 新阶段,未来还有哪些财富效应?

在当前区块链技术的发展中&#xff0c;Layer 2&#xff08;L2&#xff09;解决方案已成为提高区块链扩容性、降低交易成本和提升交易速度的关键技术&#xff0c;但它仍面临一些关键问题和挑战&#xff0c;例如用户体验的改进、跨链互操作性、安全性以及去中心化程度。在这些背景…

Python 全栈体系【四阶】(十八)

第五章 深度学习 一、基本理论 4. 神经网络的改进 4.1 神经网络的局限 全连接神经网络的局限&#xff08;一&#xff09; 未考虑数据的“形状”&#xff0c;会破坏数据空间结构。例如&#xff0c;输入数据是图像时&#xff0c;图像通常是高长通道方向上的 3 维形状。但是&a…

皓学IT:WEB07_ JSP

一、Jsp基础语法 1.1. JSP模板元素 JSP页面中的HTML内容称之为JSP模版元素。 JSP模版元素定义了网页的基本骨架&#xff0c;即定义了页面的结构和外观。 1.2. JSP脚本片段 JSP脚本片断用于在JSP页面中编写多行Java代码&#xff08;在<%%>不能定义方法&#xff09;。…

VisionOS应用开发需要哪些工具

标题: VisionOS应用开发需要哪些工具 标签: [VisionOS, 空间计算] 分类: [VisionOS, 开发工具] 说下开发visionOS空间应用需要哪些准备&#xff0c;这里我找了下&#xff0c;列出来给大家。 xcode 15.22d: SwiftUI3d: RealityKit/Unity 3D实体空间: ARKitIntel Mac上可以运行X…

mysql8.0下载安装详细步骤 图文教程

下载mysql 保证电脑上之前没有安装过mysql&#xff0c;或者已经卸载完毕。 mysqk8.0 下载地址 解压 新建一个专门存放mysql文件夹&#xff0c;将下载的压缩包解压到这个文件夹里面。 配置 添加一个data文件夹&#xff0c;用来存放数据 新建一个my.txt文本&#xff0c;复制…

C++语言·入门

现在我们讲完了数据结构初阶部分的内容&#xff0c;数据结构剩下的内容会在C语言讲解的差不多的时候加入。 1. 什么是C C语言是结构化模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度抽象和建模时&#xff0c…

软件测试-用例篇

目录 1 测试用例的基本要素2 测试用例给我们带来的好处3 测试用例的设计方法3.1 基于需求进行测试用例的设计3.1.1 功能需求测试分析3.1.2 非功能需求测试分析 4 具体的设计方法4.1 等价类4.2 边界值4.3 错误猜测法4.4 场景设计法4.5 因果图4.5.1 因果图需要掌握的基本知识4.5.…

用一个程序解决SQLite常见的各项操作(实用篇)

文章说明&#xff1a; 本篇文章是在之前的一篇文章SQLite3进行数据库各项常用操作基础上写的&#xff0c;将SQLite涉及到的常用的几种操作&#xff0c;以函数的形式处理成相互调用的形式。 因为之前的文章对基础操作已经解释过了&#xff0c;所以这里直接放置可执行代码和结果…

基于YOLOv8的绝缘子检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的绝缘子小目标检测&#xff0c;阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&a…

kali Linux上安装docker过程记录

安装情况&#xff1a; 直接安装提示错误&#xff01;&#xff01;&#xff01; 安装程序命令&#xff1a; apt install -y docker.io 安装结果提示安装失败&#xff01;&#xff01;&#xff01;看别人安装直接成功到我这怎么失败&#xff01;&#xff01;&#xff01;找原因…

引用,内联函数,auto函数,指针nullptr

一&#xff1a;引用 1.1 该文章的引用是对上一篇引用的进行补充和完善 按理来说&#xff0c;double可以隐式转换为int&#xff0c;那起别名的时候为什么不可以类型转换呢&#xff1f; 那是因为&#xff0c;在类型转换的时候&#xff0c;会创建一个临时变量&#xff0c;让后再…

如何提高小红书笔记的收录率?

在小红书平台上&#xff0c;笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率&#xff0c;有几个关键点需要注意&#xff1a; 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…

24年大一训练一(东北林业大学)

前言&#xff1a; 周五晚上的训练赛&#xff0c;以后应该每两周都会有一次。 正文&#xff1a; Problem:A矩阵翻转&#xff1a; #include<bits/stdc.h> using namespace std; int a[55][55]; int main(){int n,m;while(cin>>n>>m){for(int i1;i<n;i){for…

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…

PDF转成二维码分享

在制作电子产品册之前&#xff0c;你需要思考以下几个问题&#xff1a;你的电子产品册是面向什么人群的&#xff1f;是宣传册、使用手册还是产品介绍册&#xff1f;明确目标与定位有助于我们更好地规划产品册的内容和风格。 一、收集素材与整理信息 在开始制作之前&#xff0c…

latex学习笔记

一 安装latex&#xff08;vscodetexlive&#xff09; 安装latex学习链接&#xff1a; 【超详细】最好用LaTex环境安装配置手把手教学&#xff01;&#xff01;&#xff08;支持双向搜索&#xff0c;附赠所需安装包及竞赛模板&#xff09;_哔哩哔哩_bilibilihttps://www.bilib…

KeepAlived使用介绍

目录 1、Introduce 2、基本使用 &#xff08;1&#xff09;安装 &#xff08;2&#xff09;配置文件 &#xff08;3&#xff09;使用教程 1、Introduce keepalived是一个用于实现高可用性和负载均衡的开源软件。它提供了一种轻量级的方式来管理多个服务器&#xff0c;并确保…

高效解决Ubuntu Server 18.04.1 LTS 64bit更新gdb8.1.1到gdb12.1

文章目录 问题解决步骤 问题 因为需要用到gdb一些指令&#xff0c;但是gdb8.x好像存在普遍的问题&#xff0c;实现不了某些指令&#xff0c;比方说set detach-on-fork on&#xff0c;升级版本也没有比较好的教程 经过我不断的试错&#xff0c;我终于升级成功了&#xff01;&a…

【学习笔记】java项目—苍穹外卖day02

文章目录 苍穹外卖-day02课程内容1. 新增员工1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码开发1.2.1 设计DTO类1.2.2 Controller层1.2.3 Service层接口1.2.4 Service层实现类1.2.5 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 …