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

news2024/10/6 20:32:28

目录

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 second

PLL 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://www.coloradmin.cn/o/1526528.html

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

相关文章

Flink实时数仓之用户埋点系统(二)

用户埋点平台-数仓建模 1、数据仓库 1.1 数据仓库的构建 1.1.1 数据模型 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用角度合理存储数据。只有将数据有序的组织和存储起来之后&#xff0c;数据才能得到高性能、低成本、高效率、高质量的使用。…

【ArcGISProSDK】获取扩展模块许可到期时间

结果 以下是获取的3D分析模块的许可到期时间 代码 var licenseExpirationDate ArcGIS.Core.Licensing.LicenseInformation.GetExpirationDate(LicenseCodes.Analyst3D); 扩展模块 MemberDescriptionAnalyst3D3D AnalystAviationAirportsAviation and AirportsBusinessAnal…

数目之差

解法一&#xff1a; 显然只需让多的在限度内最多即可 #include<iostream> #include<algorithm> using namespace std; #define endl \n void solve() {int n, k, num0 0, num1 0;cin >> n >> k;string s;cin >> s;for (int i 0; i < s.s…

OpenAI Q-Star:AGI距离自我意识越来越近

最近硅谷曝出一份54页的内部文件&#xff0c;揭露了去年OpenAI宫斗&#xff0c;导致Altman&#xff08;奥特曼&#xff09;差点离职的神秘项目——Q-Star&#xff08;神秘代号Q*&#xff09;。 根据该文件显示&#xff0c;Q-Star多模态大模型拥有125万亿个参数&#xff0c;比现…

linux之source.list解析

众所周知&#xff0c;linux可以通过apt命令安装软件&#xff0c;那么apt又是从哪里获取软件包呢并安装呢&#xff1f;这里就绕不开一个文件source.list&#xff0c;该文件定义了软件源相关的信息。下面以实际例子&#xff0c;详细的介绍下这个文件。 文件作用 定义软件源的信…

就业班 第二阶段 2401--3.18 初识mysql

初识&#xff1a; 1、关系型数据库mysql、mariadb、sqlite 二维关系模型 2、非关系型数据库 redis、memcached sql 四个部分 DDL 数据库定义语言 创建数据库&#xff0c;创建用户&#xff0c;创建表 DML 数据库操作语言 增删改 DQL 数据库查询语言 查 DCL 数据库控制语言 授权 …

phpstudy自定义安装mysql8.3并启动

phpstudy自定义安装mysql8.3并启动 先去官网:https://dev.mysql.com/downloads/下载压缩包文件 然后按下面的图片一步一步操作 选择版本&#xff0c;选择第一个压缩包文件&#xff0c;下载 下载完成后&#xff0c;解压到phpstudy环境目录下&#xff0c;如下图 然后进入mysq…

Ubuntu 搭建gitlab服务器,及使用repo管理

一、GitLab安装与配置 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 1、安装Ubuntu系统&#xff08;这个教程很多&#xff0c;就不展开了&#xff09;。 2、安装gitlab社区版本&#xff0c;有需…

【每日一题】区域和检索 - 数组不可变

文章目录 Tag题目来源解题思路方法一&#xff1a;自定义前缀和数组方法二&#xff1a;使用 accumulate() 实现前项求和 写在最后 Tag 【前缀和】【数组】【2024-03-18】 题目来源 303. 区域和检索 - 数组不可变 解题思路 方法一&#xff1a;自定义前缀和数组 前缀和的基础知…

第四百零二回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

如何突破DRAM对SSD容量提升的限制?

近日小编看到Pure Storage公司的研发高级副总裁肖恩罗斯马林(Shawn Rosemarin)的一个观点“由于DRAM的局限性&#xff0c;固态硬盘(SSD)的容量难以突破30TB”。 这个观点不是完全准确&#xff0c;实际上&#xff0c;Solidigm已经发布了最大容量61.44TB QLC SSD。 但是&#xf…

AI 初创公司趋势:Y Combinator 最新批次的见解

总部位于硅谷的著名创业加速器 Y Combinator (YC) 最近宣布了其 2023 年冬季队列&#xff0c;不出所料&#xff0c;约 31% 的初创公司&#xff08;269 家中有 80 家&#xff09;拥有自我报告的 AI 标签。在这篇文章中&#xff0c;我分析了这批 20-25 家初创公司&#xff0c;以了…

深度剖析:数字经济下人工智能水平的新测算模型数据集

数据来源&#xff1a;企业年报时间跨度&#xff1a;1991-2022年数据范围&#xff1a;各企业数据指标&#xff1a; 年份 股票代码 公司名称 总词频 词频加1取对数 人工智能 计算机视觉 图像识别 知识图谱 智能教育 增强现实 智能政务 特征提…

Leetcode刷题笔记——动态规划(背包问题)篇

Leetcode刷题笔记——动态规划&#xff08;背包问题&#xff09;篇 一、0-1 背包问题 0-1背包问题简介 有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包…

HTML学习:图片格式——超链接

一、图片格式 1.jpg格式 概述:扩展名为.jpg 或.jpeg &#xff0c;是一种有损的压缩格式(把肉眼不容易观察出来的细节丢弃了)。 主要特点:支持的颜色丰富、占用空间较小、不支持透明背景、不支持动态图。 使用场景:对图片细节没有极高要求的场景&#xff0c;例如:网站的产品…

容器数据卷

目录 一、容器数据卷概念 二、使用数据卷 2.1直接使用命令来挂载 三、实战测试 四、具名挂载和匿名挂载 4.1匿名挂载举例&#xff1a; 4.2具名挂载举例&#xff1a; 五、数据卷容器 一、容器数据卷概念 数据&#xff1f;如果数据都在容器中&#xff0c;那么容器删除&am…

linux(Ubuntu22) 一篇带你学会Linux,详细篇

Linux 简介 精通Linux&#xff0c;自带python&#xff0c;系统开源 电脑可安装双系统 c盘安装win D盘安装linux 在一套硬件上只能同时运行一个操作系统 虚拟机 模拟真实环境 在虚拟机内运行操作系统 需要硬件支持虚拟化 开启VT-X VM…

Web基础06-AJAX,Axios,JSON数据

目录 一、AJAX 1.概述 2.主要作用 3.快速入门 4.AJAX的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5.同源策略 二、Axios 1.概述 2.快速入门 3.请求方式别名 三、JSON 1.概述 2.主要作用 3.基础语法 4.JSON数据转换 &#xff08;1…

洛谷_P1152 欢乐的跳_python写法

思路&#xff1a; 这道题我用到了集合的互异性来判断这组数字是否满足条件我觉得是比较有效一点的。 data list(map(int,input().split())) data data[1:] l [i for i in range(1,len(data))] s [] for i in range(len(data)-1):s.append(abs(data[i] - data[i1]))if set(…

RVA和FOA转换---三

文章目录 修改初始值RVA和FOA转换RVAFOARVA和FOA的关系 本次内容包含如何修改程序中的初始值&#xff0c;和如何转换内存和文件的地址。 修改初始值 问题&#xff1a; 我们写了一个程序&#xff0c;可以输出一个结果&#xff0c;那么我们可以通过修改PE文件来改变这个输出结果…