02_递推

0x02.基本算法 — 递推与递归 目录递推与递归分治模拟计算机实现递归相应习题:0.AcWing 92. 递归实现指数型枚举(递归/循环+位运算)1.AcWing 93. 递归实现组合型枚举2.AcWing 94. 递归实现排列型枚举 (全排列)3.AcWing 95. 费解的开关4.奇怪的汉诺塔 (n盘3柱)4.1奇怪的汉诺塔++(n盘m柱)5.POJ 1845 Sumdiv(AcWing 97. 约数之和)(数论)(分治)6.... 阅读详情

费解的开关

你玩过“拉灯”游戏吗?
25 盏灯排成一个 5×5 的方形。
每一个灯都有一个开关,游戏者可以改变它的状态。
每一步,游戏者可以改变某一个灯的状态。
游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。

下面这种状态
10111
01101
10111
10000
11011
在改变了最左上角的灯的状态后将变成:
01111
11101
10111
10000
11011
再改变它正中间的灯后状态将变成:
01111
11001
11001
10100
11011
给定一些游戏的初始状态,编写程序判断游戏者是否可能在 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 <bits/stdc++.h>

using namespace std;

const int N = 6;

int dx[5] = {1, 0, -1, 0, 0};
int dy[5] = {0, 1, 0, -1, 0};
char st[N][N], backup[N][N];

//十字操作
void turn(int x, int y)
{
    for(int i = 0; i < 5; i++)
    {
        int a = x + dx[i];
        int b = y + dy[i];
        if(a > 5 || a < 0 || b > 5 || b < 0)
            continue;
        //异或运算:0^1=1,1^1=0
        st[a][b] ^= 1;
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        for(int i = 0; i < 5; i++)
            scanf("%s", st[i]);
        
        //最大步数为6,answer初值大于6    
        int answer = 10;
        //备份
        memcpy(backup, st, sizeof st);
        
        //第一行5个开关,总共2^5种按法
        //遍历所有按法,1代表按,0代表不按
        for(int op = 0; op < 32; op++)
        {
            int step = 0;
            for(int i = 0; i < 5; i++)
            {
                //op的第i位是否为1
                //第i位按不按
                if(op >> i & 1)
                {
                    turn(0,i);
                    step++;
                }
            }
            
            //第一行确定,剩下的具有唯一性
            for(int i = 0; i < 4; i++)
            {
                for(int j = 0; j < 5; j++)
                {
                    if(st[i][j] == '0')
                    {
                        turn(i+1, j);
                        step++;
                    }
                }
            }
            
            //判断最后一行还有没有暗的
            bool dark = false;
            for(int i = 0; i < 5; i++)
            {
                if(st[4][i] != '1')
                {
                    dark = true;
                    break;
                }
            }
            
            if(!dark)
                answer = min(answer, step);
            
            memcpy(st, backup, sizeof st);
        }
        if(answer > 6)
            cout<< -1 <<endl;
        else
            cout<< answer <<endl;
    }
    return 0;
}

翻硬币

小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。

输出格式
一个整数,表示最小操作步数

数据范围
输入字符串的长度均不超过100。
数据保证答案一定有解。

输入样例1:
**********
o****o****
输出样例1:
5

输入样例2:
*o**o***o***
*o***o**o***
输出样例2:
1
#include <bits/stdc++.h>

using namespace std;

const int N = 110;

char st[N], aim[N];
int step;

void turn(int x)
{
    if(st[x] == '*')
        st[x] = 'o';
    else
        st[x] = '*';
}

int main()
{
    scanf("%s %s", st, aim);
    int len = strlen(st);
    for(int i = 0; i < len; i++)
    {
        if(st[i] != aim[i])
        {
            step++;
            turn(i + 1);
        }
    }
    printf("%d\n", step);
    return 0;
}

数的范围

给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。
如果数组中不存在该元素,则返回 -1 -1。

输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。
第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。
接下来 q 行,每行包含一个整数 k,表示一个询问元素。

输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回 -1 -1。

数据范围
1≤n≤100000
1≤q≤10000
1≤k≤10000

输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int n, m;
int q[N];

int main()
{
    int x, l, r, mid;
    scanf("%d %d", &n, &m);
    
    for(int i = 0; i < n; i++)
        scanf("%d", &q[i]);
        
    while(m--)
    {
        scanf("%d", &x);
        l = 0;
        r = n-1;
        while(l < r)
        {
            mid = l + r >> 1;
            if(q[mid] >= x)
                r = mid;
            else
                l = mid+1;
        }
        
        if(q[r] == x)
        {
            cout << r <<" ";
            l = r;
            r = n-1;
            while(l < r)
            {
                mid = l + r + 1>> 1;
                if(q[mid] <= x)
                    l = mid;
                else
                    r = mid-1;
            }
            cout << l << endl;
        }
        else
            cout << "-1 -1\n";
    }
    return 0;
}
Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思 最近因为工作原因需要使用Qt开发一个类似于Visio的流程图组件,需满足基本的流程图功能,图元类型可自定义扩展,不同图元存有各类自定义数据,可以保存为xml文件,可以读取xml文件生成流程图等等。 阅读详情

相关推荐

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4330

递推与递归经典问题的python实现

title: 递推与递归经典问题的python实现 date: 2020-03-26 22:13:26 categories: 算法 tags: [python, 递推与递归] 递归实现指数型枚举 从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。 对于没有选任何数的方案,输出空行。 本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。 数据范围 1≤n≤1.

pxlsdz的博客 1460

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2101

题目:[蓝桥杯]翻硬币。算法:递推

1428: [蓝桥杯]翻硬币 时间限制: 1 Sec 内存限制: 256 MB 提交: 51 解决: 39 [状态] [提交] [命题人:外部导入] 题目描述 小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。 比如,可能情形是:oo*oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

菜瓜变菜鸟 1157

生成对抗网络(GAN、DCGAN、ACGAN)-----学习笔记

生成对抗网络学习笔记 生成对抗网络有两个关键结构:生成模型、判别模型。 生成模型:输入是一个服从正态分布的N维向量,利用这个N维向量生成一张图片。 判别模型:对于生成模型输出的图像判别它是不是真的图像。 生成模型和判别模型的博弈关系在于:生成模型的目的是生成让判别模型无法判别真伪的图像,而判别模型的目的是判断输入图像的真伪。 结合代码来看生成对抗网络中,生成器和判别器的训练过程: 判别模型的训...

weixin_43227526的博客 5489

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6873

翻硬币

小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。 比如,可能情形是:oo*oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 我们约定:把翻动相邻的两个硬币叫做一步操作。 输入格...

qq_43573977的博客 207

独家开源|RK3588 平台 YOLOv5 Android 源码级解析:NPU 量化、多线程与目标跟踪实战

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

m0_71589036的博客 193

题目 1453: 翻硬币

代码 双向BFS,这题很像 蓝桥杯 题目 1426: 九宫重排,但是盲目遍历会超时,因此需要加一些限定条件。 #include<bits/stdc++.h> #include<string> using namespace std; char a[1001],b[1001];//每行的长度< 1000 int len,n; queue <string> q; map <string,int> m;//存放演化方向(从头变化来的or从结果变化而来的) m

博客简介 515

LVGL(lv_table)

LVGL中的lv_table是一个轻量级表格控件,用于显示行列式文本数据。它支持设置单元格内容/样式、行列调整、事件响应等基础功能,适用于参数配置、数据展示等场景。通过API可快速创建表格,设置行列数、填充数据,并自定义对齐方式与样式。但需注意默认无滚动条、行数限制等问题。该控件适合简单表格需求,复杂交互需结合自定义事件处理。

m0_49476241的博客 1262

RTX6000 PRO BLACKWELL 最优 CUDA 版本选择指南(适配 vLLM/SGLang 大模型推理)

本文针对NVIDIA Blackwell架构RTX6000PRO显卡部署vLLM/SGLang大模型推理引擎时的CUDA版本选择问题,提出专业建议。分析表明,CUDA12.9(需搭配552.06+驱动)是最优选择,因其完全支持BW架构特性,且与vLLM/SGLang最新版本深度适配。文章提供详细的Linux环境部署教程,包括驱动升级、CUDA12.9安装及vLLM/SGLang配置步骤,并指出CUDA13.0目前适配不完善,不推荐新手使用。最后给出常见问题解决方案,强调版本匹配对推理性能和稳定性的重要性。

2501_93651177的博客 681

【蓝桥杯预备营集结十】软件类 C/C++ 预备试题分析及解答

🎉🎉目前持续总结更新,请持续关注!!!🎉🎉 💗 大家好🤗🤗🤗,我是左手の明天!💗 📆 最近更新:2022 年 4 月 18 日,左手の明天的第229篇原创博客 🥇更新于专栏:蓝桥杯预备营 🌟🌟 往期必看 🌟🌟 【蓝桥杯预备营集结一】软件类 C/C++ 预备试题分析及解答 【蓝桥杯预备营集结二】软件类 C/C++ 预备试题分析及解答 【蓝桥杯预备营集结三】软件类 C/C++ 预备试题分析及解答 【蓝桥杯预备营集结四】软件类 C/C++ 预备试题分析及解答 【蓝桥杯预备营集结五...

左手の明天的博客 795

21、空间数据处理中的克里金方法及应用

本文介绍了空间数据处理中的克里金方法,特别是带外部漂移的克里金法(KED)及其在遥感数据融合和支持变化问题中的应用。讨论了克里金方法的基本原理、优缺点以及在不同空间分辨率遥感图像融合中的具体操作流程。同时,还涉及了地统计数据融合和支持变化问题的解决方案,包括块克里金法、面到点克里金法和多边形克里金法等。

gold的博客 86

02-递推

1、简单递推 1188:菲波那契数列(2) 【题目描述】 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。 【输入】 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。 【输出】 n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。 【输入样例】

ysyzxj的博客 211

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

0x02递推与递归

递推者,自小而大,循序渐进;递归者,由上而下,分而治之。

louisdlee的博客 993

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

0x02 递推与递归

递推与递归

qq_61143965的博客 483

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

0x02 __ 递推与递归

0x02__递推与递归

lsz014775的博客 2985

蓝桥杯备赛day02:递推

第 n 年春季的时候,母牛 M 拥有后代母牛的个数等于第 n-1 年拥有后代母牛的个数加上第 n 年生产的小牛。共有多少头后代母牛”,第一年不生产小牛,后代母牛个数为0,第二年生产一头小牛,后代母牛个数为1,第三年生成一头小牛,后代母牛个数为2,第四年,母牛M生产一头小牛,第二年生产的小牛已经长大也生产一头小牛,总共生产2头小牛,后代母牛个数为4,第五年,母牛M生产一头小牛,第二年生产的小牛生产一头小牛,第三年生产的小牛生产一头小牛,总共生产3头小牛,后代母牛个数为7。询问是过Z个月以后,共有成虫多少对。

qq_53237241的博客 1478

0x02 递推与递归学习笔记

算法竞赛进阶指南

nicole_coco的博客 235

0x02 枚举、模拟、递推

【代码】0x02 枚举、模拟、递推。

2302_79268945的博客 287

0x02 递推和递归

递推与递归递归实现指数型枚举题目思路code递归实现组合型枚举题目思路code递归实现排序型枚举题目思路code费解的开关题目思路code 递归实现指数型枚举 题目 从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。 对于没有选任何数的方案,输出空行。 (也就是...

Z 340

0x02递推和递归

共同点是:每个变换步骤都具有相似性。递推是:从已知到未知。递归是:从未知到已知。

qq_60653991的博客 140

《算法竞赛进阶指南》0x02递推与递归

一个实际问题的各种可能的情况构成的集合常称为”状态空间“,而程序的运行则是对于状态空间的遍历,算法和数据结构则通过划分、归纳、提取、抽象来帮助提高程序遍历状态空间的效率。递推和递归就是遍历状态空间的两种基本方式。

m0_70897036的博客 728
上一篇: 01_递归
下一篇: Mybatis_05/23
笑着找bug
博客等级 码龄7年 22粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值