蓝桥杯(更新中)

递归与递推

递归

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;}
}

前缀和例题:

AcWing 1230. K倍区间

分析:

代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;
const int N = 1e5 + 10;
LL s[N], cnt[N];
int n, k;int main()
{scanf("%d%d", &n, &k);for (int i = 1; i <= n; i ++){scanf("%lld", &s[i]);s[i] += s[i - 1];}LL res = 0;cnt[0] = 1; //s[0] = 0, s[0] % k = 0for (int i = 1; i <= n; i ++){res += cnt[s[i] % k];cnt[s[i] % k] ++;}printf("%lld\n", res);return 0;
}


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

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

相关文章

游戏引擎架构01__引擎架构图

根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ​

ES6学习(四)-- Reflect / Promise / Generator 函数 / Class

文章目录 1. Reflect1.1 代替Object 的某些方法1.2 修改某些Object 方法返回结果1.3 命令式变为函数行为1.4 ! 配合Proxy 2. ! Promise2.1 回调地狱2.2 Promise 使用2.3 Promise 对象的状态2.4 解决回调地狱的方法2.5 Promise.all2.6 Promise.race 3. Generator 函数3.1 基本语…

【现代企业管理】企业组织结构和组织文化的理论与实践——以华为为例

一、前言 管理是科学和艺术的统一体&#xff0c;它是企业成长的保证。企业管理中&#xff0c;管理者面对的往往不是一个完整的系统&#xff0c;而是各种不具有整体规律性的零碎信息的总和&#xff0c;因此进行信息的整合和研究是管理的重点和关键。 组织管理作为管理的四大职…

AGV无人驾驶跨境运输新模式引领未来物流

agv AGV即“自动导引运输车”&#xff0c;这一概念起源于欧美&#xff0c;在欧美及日韩市场的发展比较成熟&#xff0c;于上世纪末被引入国内。这种自动导引运输车可以广泛应用于汽车、化工、医药以及食品饮料等制造业场景&#xff0c;以及机场、码头等仓储物流行业场景&#x…

Redis入门到实战-第十九弹

Redis入门到实战 Redis中Count-min-sketch数据类型常见操作官网地址Redis概述Count-min-sketch常见操作更新计划 Redis中Count-min-sketch数据类型常见操作 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准…

UE4 方块排序动画

【动画效果】 入动画&#xff1a; 出动画&#xff1a; 【分析】 入动画&#xff1a;方块动画排序方式为Z字形&#xff0c;堆砌方向为X和Y轴向 出动画&#xff1a;方块动画排序方式为随机 【关键蓝图】 1.构建方块砌体 2.入/出动画

【大模型】大模型 CPU 推理之 llama.cpp

【大模型】大模型 CPU 推理之 llama.cpp llama.cpp安装llama.cppMemory/Disk RequirementsQuantization测试推理下载模型测试 参考 llama.cpp 描述 The main goal of llama.cpp is to enable LLM inference with minimal setup and state-of-the-art performance on a wide var…

GPTs构建广告文案Agent(只需要一个网址链接即可生成文案及配图)

在大家已经有账号的前提下&#xff0c;我们来看看怎么做&#xff01;&#xff01;&#xff01; 进入GPTs的编辑界面 如下图&#xff1a; 如何配置呢&#xff1f; Name&#xff1a;给我们的GPTs起个名字。Description&#xff1a;简单介绍一下&#xff0c;我们创建的GPTs是…

亚马逊卧式婴儿车和坐式婴儿车需要那些认证?欧盟美国加拿大要求那些检测标准

卧式婴儿车和坐式婴儿车上亚马逊需要那些认证&#xff1f;欧盟美国加拿大要求那些检测标准&#xff1f; 很荣幸您能看到我的资讯&#xff0c;亚马逊各国认证是我公司的优势产品&#xff0c;确保申诉成功并正常销售。服务周到&#xff0c;速度快&#xff0c;周期短。 欧盟 卧…

消息存储与同步策略设计

消息存储与同步策略 https://github.com/robinfoxnan/BirdTalkServer 思路&#xff1a; 私聊写扩散&#xff0c;以用户为中心&#xff0c;存储2次&#xff1b;群聊读扩散&#xff0c;以群组为中心&#xff0c;存储一次&#xff1b;scylladb易于扩展&#xff0c;适合并发&…

双机 Cartogtapher 建图文件配置

双机cartogtapher建图 最近在做硕士毕设的最后一个实验&#xff0c;其中涉及到多机建图&#xff0c;经过调研最终采用cartographer建图算法&#xff0c;其中配置多机建图的文件有些麻烦&#xff0c;特此博客以记录 非常感谢我的同门 ”叶少“ 山上的稻草人-CSDN博客的帮助&am…

【2024红明谷】三道Web题目的记录

红明谷 文章目录 红明谷Web1 | SOLVED LaterWeb2 | UNSOLVEDWeb3 | SOLVED 容器已经关咯&#xff0c;所以有些场景只能靠回忆描述啦&#xff0c;学习为主&#xff0c;题目只是一个载体~ 本次比赛学习为主&#xff0c;确实再一次感受到久违的web题目的魅力了&#xff0c;可能也是…

3.java openCV4.x 入门-数据类型(CvType)与Scalar

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天 &#x1f9ed;文章导航&#x1f9ed; ⬆️ 2.hello openCV ⬇️ 4.待更新 数据类型&#xff…

RD55UP06-V 三菱iQ-R系列C语言功能模块

RD55UP06-V 三菱iQ-R系列C语言功能模块 RD55UP06-V用户手册&#xff0c;RD55UP06-V功能&#xff0c;RD55UP06-V系统配置 RD55UP06-V参数规格&#xff1a;10BASE-T/100BASE-TX/1000BASE-T 1通道&#xff1b;字节存储次序格式小端模式; 可使用SD存储卡插槽&#xff1b;工作RAM 1…

结构体,联合体,枚举( 2 )

目录 2.联合体 2.1联合体类型的声明 2.2联合体的特点 2.3联合体的内存大小 3.枚举 3.1枚举类型的声明 3.2枚举类型的优点 3.3枚举类型的使用 2.联合体 联合体&#xff08;Union&#xff09;是另一种复合数据类型&#xff0c;它允许我们在同一内存位置存储不同的数据类型…

Windows搭建Lychee图片管理系统结合内网穿透实现公网访问本地图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-AwzyR2lkHKjD9HYl {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

linux设置Nacos自启动

前提&#xff1a;已经安装好nacos应用 可参考&#xff1a;Nacos单机版安装-CSDN博客 1. 创建nacos.service 1.1 在 /lib/systemd/system 目录底下&#xff0c;新建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service]Typeforking# 单机启动方式&#…

让手机平板成为AI开发利器:AidLux

想ssh登录自己的手机吗&#xff1f; 想在手机上自由的安装lynx、python、vscode、jupyter甚至飞桨PaddlePaddle、Tensorflow、Pytorch和昇思Mindspore吗&#xff1f; 那么看这里....装上AidLux&#xff0c;以上全都有&#xff01; AidLux是一个综合的AI开发平台&#xff0c;…

JAVAEE之Spring, Spring Boot 和Spring MVC的关系以及区别

1.Spring, Spring Boot 和Spring MVC的关系以及区别 Spring: 简单来说, Spring 是⼀个开发应⽤框架&#xff0c;什么样的框架呢&#xff0c;有这么⼏个标签&#xff1a;轻量级、⼀ 站式、模块化&#xff0c;其⽬的是⽤于简化企业级应⽤程序开发 Spring的主要功能: 管理对象&am…