【递归专题】【蓝桥杯备考训练】:有序分数、正则问题、带分数、约数之和、分形之城【已更新完成】

目录

1、有序分数(usaco training 2.1)

2、正则问题(第八届蓝桥杯省赛C++ A组 & Java A组)

3、带分数(第四届蓝桥杯省赛Java A组/B组 & C++ B组/C组)

4、约数之和(《算法竞赛进阶指南》)

5、分形之城(《算法竞赛进阶指南》)


1、有序分数(usaco training 2.1)

给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1]范围内的最简分数,并按从小到大顺序依次输出。

例如,当 N=5 时,所有满足条件的分数按顺序依次为:

0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5,1/1

输入格式

共一行,包含一个整数 N。

输出格式

按照从小到大的顺序,输出所有满足条件的分数。

每个分数占一行,格式为 a/b,其中 a 为分子, b为分母。

数据范围

1≤N≤160

输入样例:
5
输出样例:
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
思路:

用一个pair对来维护最小值对应的分子分母,将所有情况枚举,为了避免重复我们要用一个set来确保没有重复的数值

这里要注意进入递归函数要直接进入最里面的一层开始往上递归,这样就可以做到所有分数的都是最简分数式

代码:

#include<bits/stdc++.h>using namespace std;int n;typedef pair<int,int> PII;typedef pair<double,PII> PDP;const int N=1e5;vector<PDP>res;unordered_set<double>cnt;void work(int n)
{if(n==0)return ;work(n-1);for(int i=n-1;i>0;i--){double number=(double)i/n;if(cnt.find(number)!=cnt.end())continue;cnt.insert(number);PII t={i,n};res.push_back({number,t});}}bool cmp(PDP a,PDP b)
{return a.first<b.first;
}int main()
{cin>>n;res.push_back({0,{0,1}});res.push_back({1,{1,1}});work(n);sort(res.begin(),res.end(),cmp);for(auto t:res){cout<<t.second.first<<"/"<<t.second.second<<endl;}return 0;
} 

2、正则问题(第八届蓝桥杯省赛C++ A组 & Java A组)

考虑一种简单的正则表达式:

只由 x ( ) | 组成的正则表达式。

小明想求出这个正则表达式能接受的最长字符串的长度。

例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。

输入格式

一个由x()|组成的正则表达式。

输出格式

输出所给正则表达式能接受的最长字符串的长度。

数据范围

输入长度不超过100,保证合法。

输入样例:
((xx|xxx)x|(x|xx))xx 
输出样例:
6
思路:

递归+回溯

代码:
#include<bits/stdc++.h>using namespace std;int k=0;string s; //((xx|xxx)x|(x|xx))xx 
//6
int dfs()
{int res=0;while(k<s.size()){if(s[k]=='('){k++;res+=dfs();k++;}else if(s[k]==')'){break;}else if(s[k]=='|'){k++;res=max(res,dfs());}else{k++;res++;}}return res;
}int main()
{cin>>s;int res=dfs();cout<<res;return 0;
}

3、带分数(第四届蓝桥杯省赛Java A组/B组 & C++ B组/C组)

100可以表示为带分数的形式:100=3+69258/714

还可以表示为:100=82+3546/197

注意特征:带分数中,数字 1∼9分别出现且只出现一次(不包含 0)。

类似这样的带分数,100 有 11种表示法。

输入格式

一个正整数。

输出格式

输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。

数据范围

1≤N<1e6

输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
思路:

由于c++的/并不准确,我们把除法转化为乘法,再进行枚举(n=a+b/c转化为nc=ac+b)

从而我们枚举出a和c就可以算出b,b=nc-ac;

用had_use记录用过的数,ever用来在不影响并行递归的情况下把当前情况递归下去(不破坏原来的记录)

代码:
#include<bits/stdc++.h>using namespace std;const int N=600;//typedef long long LL;int ever[N],had_use[N];
//数组放在最上面,acwing平台由于放在了ans下面导致输出结果错误 int ans=0;int  n;//n=a+b/c
//nc=ac+b
//b=nc-ac 只要推出来的b满足条件,a和c都满足条件则答案+1 
bool check(int a,int c)
{int b=n*c-a*c;if(!a || !c || !b)return false;memcpy(ever,had_use,sizeof had_use);//基于现有的情况下,不破坏原来的数组//那就拷贝一份,既能在原来之上操作,又能不破坏原来的记录 while(b)//取出每一位,用来更新用过的数字 {int t=b%10;b/=10;if(!t || ever[t])return false;ever[t]=1;}for(int i=1;i<=9;i++)if(!ever[i])return false;return true;
}void dfs_c(int x,int a,int c)
{if(x>=10)return ;if(check(a,c))ans++;for(int i=1;i<=9;i++){if(!had_use[i]){had_use[i]=1;dfs_c(x+1,a,c*10+i);had_use[i]=0;//回溯,避免下次的递归中出现错误 }}
}void dfs_a(int x,int a)
{if(a>=n)return;if(a)dfs_c(x,a,0);//如果a满足条件,那么枚举c然后判断是否是成立的//0是c的大小 for(int i=1;i<=9;i++)//枚举一下当前能用哪些数字{if(!had_use[i]){had_use[i]=1;dfs_a(x+1,a*10+i);had_use[i]=0;//恢复现场,回溯一下 }	} 
}int main()
{	//cout<<714*97;cin>>n;dfs_a(0,0);//第一个表示当前用了多少个数字,第二个参数表示当前的a是多少 cout<<ans;return 0;
}

4、约数之和(《算法竞赛进阶指南》)

假设现在有两个自然数 A 和 B,S 是A的B次方的所有约数之和。

请你求出 S mod9901 的值是多少。

输入格式

在一行中输入用空格隔开的两个整数 A 和 B。

输出格式

输出一个整数,代表 Smod9901 的值。

数据范围

0≤A,B≤5×1e7

输入样例:
2 3
输出样例:
15

注意: A 和 B不会同时为 0。

思路:

分解质因数,把每个质因数的从第0项到最高次数的和乘起来就是约数之和

由于是求A的B次方的约数之和,我们可以先把A分解质因数,次方B可以后来再给到质因数的次方上

代码:
#include<bits/stdc++.h>using namespace std;const int MOD=9901;typedef long long LL;LL a,b;
LL res=0;unordered_map<int,int>primes;LL quickmi(LL a,LL b)
{LL res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD;b=b>>1;}return res%MOD;
}void divide(LL x)
{for(int i=2;i<=x/i;i++){if(x%i==0){while(x%i==0){primes[i]++;x/=i;}}}if(x>1)primes[x]++;
}//求p0+....pk-1 
LL sum(LL p,LL k)
{if(k==1)return 1;if(k%2==0)return (LL)(quickmi(p,k/2)+1)*sum(p,k/2)%MOD;return (LL)(quickmi(p,k-1)+sum(p,k-1))%MOD;
}int main()
{cin>>a>>b;divide(a);LL res=1;for(auto prime :primes){int p=prime.first;int k=prime.second*b;//p的次数 res=(LL)res*sum(p,k+1)%MOD;//求约数之和 }if(!a)res=0;cout<<res<<endl; return 0;
}

5、分形之城(《算法竞赛进阶指南》)

城市的规划在城市建设中是个大问题。

不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。

而这座名为 Fractal 的城市设想了这样的一个规划方案,如下图所示:

city.png

当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。

对于任意等级的城市,我们把正方形街区从左上角开始按照道路标号。

虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级 N,编号为 A 和 B 的两个街区的直线距离是多少。

街区的距离指的是街区的中心点之间的距离,每个街区都是边长为 10 米的正方形。

输入格式

第一行输入正整数 n,表示测试数据的数目。

以下 n 行,输入 n 组测试数据,每组一行。

每组数据包括三个整数 N,A,B表示城市等级以及两个街区的编号,整数之间用空格隔开。

输出格式

一共输出 n 行数据,每行对应一组测试数据的输出结果,结果四舍五入到整数。

数据范围

1≤N≤31
1≤A,B≤2**2N
1≤n≤1000

输入样例:
3 
1 1 2 
2 16 1 
3 4 33 
输出样例:
10 
30 
50 
思路:

我们要知道第n等级城市的信息就要知道n-1等级的(n-1等级的城市可以通过旋转变换得出n等级城市的坐标信息),递归下去,最后算出街区中心坐标然后进行勾股定理即可,注意要乘上单位长度(本代码为5)

代码:
#include<bits/stdc++.h>typedef long long LL;using namespace std;typedef pair<LL,LL> PLL;#define x first#define y secondPLL calc(LL n,LL m)
{//n代表城市等级 //m代表坐标,从0开始计数 if(n==0)return {0,0};LL len = 1ll <<(n-1);//本等级内象限的边长/2 LL cnt=1ll<<(2*n-2);//上一等级的容量PLL pos = calc(n - 1, m % cnt);  // 上一等级的坐标信息 LL x=pos.x,y=pos.y;int z=m/cnt;//处于哪个象限 if (z == 0)return { - y - len, - x + len };// 右上象限更换原点(x+len,y+len)else if (z == 1)return { x + len, y + len };// 右下象限更换原点(x+len,y-len)else if (z == 2)return { x + len, y - len };// 左下象限逆转90°(-y,x)沿y对称(y,x)更换原点(y-len,x-len)return { y - len, x - len };
}int main()
{int N;cin >> N;while (N --){LL n, m1, m2;cin >> n >> m1 >> m2;PLL pos1 = calc(n, m1 - 1);PLL pos2 = calc(n, m2 - 1);double x = (double) (pos1.first - pos2.first);double y = (double) (pos1.second - pos2.second);//单位长度要乘五printf("%.0lf\n", sqrt(x * x + y * y) * 5);}return 0;
}

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

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

相关文章

jvm的垃圾回收器以及触发full gc的场景

JVM&#xff08;Java虚拟机&#xff09;的垃圾回收器有很多种&#xff0c;主要包括以下几种&#xff1a; Serial收集器&#xff1a;串行收集器是最古老、最稳定的收集器。它使用单个线程进行垃圾收集工作&#xff0c;在进行垃圾回收时会暂停所有用户线程。 ParNew收集器&#…

ViT如何支持变长序列输入?

当增加输入图像的分辨率时&#xff0c;例如DeiT 从 224 到 384&#xff0c;一般来说会保持 patch size&#xff08;例如9&#xff09;&#xff0c;因此 patch 的数量 N 会发生了变化。那么视觉transformer是如何处理变长序列输入的? DEiT中如何处理mask数据的&#xff1f; 例…

智慧公厕对于智慧城市管理的意义

近年来&#xff0c;智慧城市的概念不断被提及&#xff0c;而智慧公厕作为智慧城市管理的重要组成部分&#xff0c;其在监测、管理和养护方面发挥着重要的作用。智慧公厕不仅是城市市容提升的重要保障&#xff0c;还能提升城市环境卫生管理的质量&#xff0c;并有效助力创造清洁…

5_相机标定2_calibrateCamera()与内外参

彩色角点图片镇楼 opencv官方文档&#xff1a; https://docs.opencv.org/4.8.0/d4/d94/tutorial_camera_calibration.html https://docs.opencv.org/3.4.18/d9/d0c/group__calib3d.html#gaebfc1c9f7434196a374c382abf43439b 相机标定目的&#xff1a; cv::calibrateCamera()的…

Arthas使用案例(二)

说明&#xff1a;记录一次使用Arthas排查测试环境正在运行的项目BUG&#xff1b; 场景 有一个定时任务&#xff0c;该定时任务是定时去拉取某FTP服务器上的文件&#xff0c;进行备份、读取、解析等一系列操作。 而现在&#xff0c;因为开发环境是Windows&#xff0c; 线上项…

SpringBoot(数据库操作 + druid监控功能)

文章目录 1.JDBC HikariDataSource&#xff08;SpringBoot2默认数据源&#xff09;1.数据库表设计2.引入依赖 pom.xml3.配置数据源参数 application.yml4.编写一个bean&#xff0c;映射表5.编写测试类来完成测试1.引入依赖 pom.xml2.使用JdbcTemplate进行测试3.成功&#xff0…

将OpenCV与gcc和CMake结合使用

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇&#xff1a; 引言&#xff1a; 近年来&#xff0c;计算机视觉技术在图像处理、目标检测和机器人等方面得到了广泛的应用…

YOLOv9改进策略:注意力机制 | 归一化的注意力模块(NAM)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; NAM作为一种高效且轻量级的注意力机制。采用了CBAM的模块集成并重新设计了通道和空间注意子模块。 yolov9-c-NAMAttention summary: 965 layers, 51000614 parameters, 51000582 gradients, 238.9 GFLOPs 改…

服务器机器学习环境搭建(包括AanConda的安装和Pytorch的安装)

服务器机器学习环境搭建 1 服务器与用户 在学校中&#xff0c;我们在学校中是以用户的身份进行访问学校的服务器的。整体框架大致如下&#xff1a; 我们与root用户共享服务器的一些资源&#xff0c;比如显卡驱动&#xff0c;Cuda以及一些其他的公共软件。 一般情况下&#…

迷茫了!去大厂还是创业?

大家好&#xff0c;我是麦叔&#xff0c;最近我创建了一个 学习圈子 有球友在 星球 里提问。 大厂的layout岗位和小厂的硬件工程师岗位&#xff0c;该如何选择&#xff1f; 这个问题我曾经也纠结过&#xff0c;不过现在的我&#xff0c;I am awake&#xff01; 肯定是有大点大。…

【Java基础知识总结 | 第二篇】深入理解分析ArrayList源码

文章目录 3.深入理解分析ArrayList源码3.1ArrayList简介3.2ArrayLisy和Vector的区别&#xff1f;3.3ArrayList核心源码解读3.3.1ArrayList存储机制&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;add()方法&#xff08;3&#xff09;新增元素大体流程 3.3.2ArrayL…

探索设计模式的魅力:探索发布-订阅模式的深度奥秘-实现高效、解耦的系统通信

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并坚持默默的做事。 探索发布-订阅模式的深度奥秘&#xff1a;实现高效、解耦的系统通信 文章目录 一、案例场景&am…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

创建硬件企业的8个要求

目录 内容简介 1. 长期愿景和目标 2. 适应和学习能力 3. 能够理解技术方面的信息 4. 建立关系的能力 5. 现金流 6. 可用时间和资金平衡 7. 一次专注于一种产品 8. 实现长期成功的耐心 CSDN学院 专栏作家 内容简介 为了创建成功的硬件产品&#xff0c;你需要具备各种…

如何在Windows系统搭建Emby影音平台并实现远程访问本地文件【内网穿透】

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

Linux系统安全②SNAT与DNAT

目录 一.SNAT 1.定义 2.实验环境准备 &#xff08;1&#xff09;三台服务器&#xff1a;PC1客户端、PC2网关、PC3服务端。 &#xff08;2&#xff09;硬件要求&#xff1a;PC1和PC3均只需一块网卡、PC2需要2块网卡 &#xff08;3&#xff09;网络模式要求&#xff1a;PC1…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的自动驾驶目标检测系统详解(深度学习+Python代码+PySide6界面+训练数据集)

摘要&#xff1a;开发自动驾驶目标检测系统对于提高车辆的安全性和智能化水平具有至关重要的作用。本篇博客详细介绍了如何运用深度学习构建一个自动驾驶目标检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLO…

IntelliJ IDEA 2023.3.4创建JavaWeb应用和集成Tomcat服务器

1. 创建项目 如下图所示&#xff0c;只需要给项目起一个项目名称&#xff0c;然后点击Create即可&#xff1a; 2. Project Structure 设置 创建完成后如下图 3. 集成Tomcat服务器 4. 实现Servlet接口 当我们实现Servlet接口时&#xff0c;发现没有Servlet相关的依赖时&am…

AcWing 2. 01背包问题

题目描述 解题思路&#xff1a; 相关代码&#xff1a; import java.util.Scanner; public class Main {public static void main(String[] args){Scanner scanner new Scanner(System.in);/** 背包问题的物品下标最好从1开始。* *//*定义一f[i][j]数组&#xff0c;i表示的…

PDF Expert:强大注释与批注功能,让PDF阅读更高效

PDF Expert软件是一款功能丰富且强大的PDF编辑和管理工具&#xff0c;为用户提供了全面的PDF处理解决方案。以下是其主要的功能特色介绍&#xff1a; PDF编辑功能&#xff1a;PDF Expert允许用户对PDF文件进行深度编辑。这包括但不限于添加、删除、重新排列和合并页面&#xff…