蓝桥杯(更新中)

news2024/11/22 20:51:26

递归与递推

递归

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; //选的数标记为true
    dfs(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
11100

11101
11101
11110
11111
11111

01111
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.coloradmin.cn/o/1562326.html

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

相关文章

解决报错——使用sqlite的扩展Spatialite

正文 笔者想使用sqlite3的扩展Spatiate 代码如下。 import sqlite3 conn sqlite3.connect(database.db) conn.enable_load_extension(True) conn.load_extension("mod_spatialite") 结果如下。 找不到指定模块。 笔者在网上到处搜索&#xff0c;终于解决了。&a…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(一)

目录 1 .导言 2.适用产品范围 3.标准目的 4.试验等级 4.1 空气放电的最高电压为何定在15kV 1 .导言 电磁兼容设计的知识储备之一便是EMC相关标准&#xff0c;标准中的测试系统标准更是基础中的基础&#xff0c;深度理解&#xff0c;对产品的EMC设计有很好的帮助。以下对最…

算法题->盛最多水的容器C语言和JAVA双指针解法

盛最多水的容器C语言和JAVA双指针解法 题目描述: 力扣链接:https://leetcode.cn/problems/container-with-most-water/description/ 题意: 根据数组中的值(高)和下标差值(宽),求能容纳最多的体积V. 例子: 输出49的求解过程,根据木桶效应,存储水的高度由短木板决定,故 V 短…

EfficientVMamba实战:使用EfficientVMamba实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2401.09417v1.pdf 作者研究了轻量级模型设计的新方法&#xff0c;通过引入视觉状态空间模型&…

Linux中JMeter的使用

Linux中JMeter的使用 Linux版本JMeter安装 # 1、下载、安装JMeter 如果有安装包直接上传即可 wget -c https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.1.tgz # 解压 tar -zxvf apache-jmeter-5.4.1.tgz -C /usr/local/sjdwz_test cd /usr/local/sjdwz_t…

书生·浦语大模型全链路开源体系-第2课

书生浦语大模型全链路开源体系-第2课 书生浦语大模型全链路开源体系-第2课相关资源实战部署InternLM2-Chat-1.8B模型准备环境下载模型运行案例 实战部署InternLM2-Chat-7B模型准备环境下载模型及案例代码运行cli案例代码运行web案例代码配置SSH公钥信息配置SHH隧道连接 熟悉 Hu…

前端之CSS——网页的皮肤!!

目录 一、CSS简单介绍 二、css内容 2.1 css的编写方式 2.2 css选择器 2.3 样式属性 2.4 css包围盒 2.5 css中的display 2.6 css中的定位 2.7 css中的浮动与清除 2.7 弹性容器 2.8 字体图标 2.9 …

R语言,数据类型转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

Linux安装nginx保姆级教程

文章目录 前言一、nginx安装&#xff08;保姆级教程&#xff09;1.安装nginx依赖2.安装wget3.创建nginx安装目录4.下载nginx5.查看下载好的nginx6.解压缩7.查看当前目录下的文件→进入nginx-1.8.0目录→查看当前目录下的文件8.安装nginx9.查看nginx安装目录并启动nginx10.网络请…

https安全性 带给im 消息加密的启发

大家好&#xff0c;我是蓝胖子&#xff0c;在之前# MYSQL 是如何保证binlog 和redo log同时提交的&#xff1f;这篇文章里&#xff0c;我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性&#xff0c;这也是分布式事务实现方式之一。今天来看看我们能够从http…

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储&#xff0c;通过vtkDataObject进行可视化数据的表达&#xff0c;在vtkDataObject内部有一个vtkFieldData的实例&#xff0c;负责对数据的表达&#xff1a; vtkFieldData存储数据的属性数据&#xff0c;该数据是对拓扑结构和几何结构信息的…

项目管理计划

《项目管理计划》 1.项目背景说明 2.项目目标和范围 3.项目组织架构 4.项目进度管理办法 5.项目沟通管理 6.项目风险管理 软件开发全套资料包获取进主页或文末个人名片直接获取。

Excel 数据-分列的三个经常用法

Case 1 &#xff1a;有时候数据导出时如果没有电子表格的话&#xff0c;只能导出本地文件&#xff0c;如下图情况&#xff1a; 可以使用数据-分列处理数据&#xff1a; 原来是因为SAP导出数据没有完成的原因&#xff0c;或者关闭Excel重新打开试一下。 重新打开后可以输入了 C…

日记本(源码+文档)

日记本&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明功能项目截图客户端首页日记列表 书写日记个人中心设置密码锁拨打客服热线修改信息退出登录登录页输入密码锁注册页 后端管理登录页首页管理员列表管理用户管理日记列表管理日记数据 文件包含…

2024年网络安全运营体系建设方案

以下是部分WORD内容&#xff0c;请您参阅。如需下载完整WORD文件&#xff0c;请前往星球获取&#xff1a; 网络安全运营监控工作整体构想 工作目标及原则 工作目标 为进一步落实强化公司网络安全保障&#xff0c;有效支撑公司数字化转型战略&#xff0c;建立健全公司网省两级协…

Tomcat调优总结

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例&#xff0c;讲解参数。 同时也得认识到一点&#xff0c;tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此可以将…

无锡国家集成电路设计中心某公司的单锂小电机直流电机H桥驱动电路

H桥驱动 L9110S是一款直流电机驱动电路&#xff0c;适合单节锂电池应用。输出电流0.4A。价格约3毛。 推荐原因&#xff1a; 某些人应该知道这个地方&#xff0c;大多数人应该不知道这个地方&#xff0c;所以推荐一下。 这个地方去过几次&#xff0c;某公司与某方走的“近”&…

用Wireshark解码H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

31.2k star, 免费开源的白板绘图工具 tldraw

31.2k star, 免费开源的白板绘图工具 tldraw 分类 开源分享 项目名: tldraw -- 无限画布白板 Github 开源地址&#xff1a; https://github.com/tldraw/tldraw 在线测试地址&#xff1a; tldraw 文档地址&#xff1a; tldraw SDK tldraw 是一款开源免费的无限画布白板&…

【NC14326】Rails

题目 Rails 栈 翻译 由于原题是英文的&#xff0c;所以这里先翻译一下&#xff1a; PopPush市有一个著名的火车站。那里的山地多得令人难以置信。这个车站建于上个世纪。不幸的是&#xff0c;当时资金极为有限。只能建立一条地面轨道。此外&#xff0c;事实证明&#xff0c;火…