蓝桥杯备战二——递归

 

(1)

问题描述

  输出一个n行的与样例类似的数字三角形,必须使用递归来实现

输入格式

  一个正整数数n,表示三角形的行数

输出格式

  输出一个与样例类似的n行的数字三角形,同一行每两个数之间用一个空格隔开即可(图中只是为防止题面格式化而用'_'代替空格)

样例输入

4

样例输出

___1
__2_3
_4_5_6
7_8_9_10

数据规模和约定

  n<=20

思路解析:递归通俗来说是由大的问题分解为若干个小的结果组成,譬如本题(斐波那契的变形)n=4,向前一值递归到n=3,n=2,n=1,得到追小的n==1的结果后返回到n==2后输出第二行的结果,返回n==3,一直到n==n;

 

#include <iostream>

using namespace std;

int n;
int sum=1;
int df(int t){
	if(t==0)return 0;//t==0返回后t==1 
	df(t-1);
	if(t<n){//从t=n-1开始 
		for(int i=1;i<=n-t-1;i++)cout<<" ";	
		
	for(int i=1;i<=t;i++){
	cout<< " "<<sum;
	sum++;
	}
	
	}
if(t==n){
	cout<<sum;
	sum++;
	for(int i=1;i<t;i++){
		cout<<" "<<sum;
		sum++;
	}
}
cout<<endl;	
}



int main() {
	cin >> n;
df(n);
}

(2)

问题描述

  给一个正整数n,输出它所有的正整数加法的分解方法。其中交换加数的位置视为不同的分解方案。按字典序输出。特别地,不分解也视为一种分解方案。

输入格式

  输入共一行一个正整数n。

输出格式

  输出若干行,为n的所有正整数加法分解方法。每种方案输出一行。对于一种方案,先输出n,再输出一个“=”。然后输出分解的各数,不同的数之间用“+”连接。

样例输入

5

样例输出

5=1+1+1+1+1
5=1+1+1+2
5=1+1+2+1
5=1+1+3
5=1+2+1+1
5=1+2+2
5=1+3+1
5=1+4
5=2+1+1+1
5=2+1+2
5=2+2+1
5=2+3
5=3+1+1
5=3+2
5=4+1
5=5

数据规模及限制

  对于100的数据,n为正整数且n≤15。

 

(3)汉诺四塔

题目背景

  XJJ最近迷上了一款小游戏——汉诺四塔,但是由于智商有限,步骤多了容易手滑,于是他请求小伙伴们来帮他,人家才不是cheat呢。

游戏规则

  同汉诺塔相似,不过塔有4个,要求将盘子从塔1运到塔4。

输入格式

  一个数n表示盘子数。

输出格式

  第一行输出step表示你的操作步数。
  接下来step行每行2个用空格隔开的数a,b表示将塔a最上面的盘子移到塔b。
  你的输出只要保证能帮XJJ通关游戏即可,对步数没有太大要求,当然你操作100000步XJJ也会等不及的啦。

数据规模和约定

  6<=n<=30;

judge

  由于答案不唯一,将用以下方法判断答案是否正确:
  ·step必须是1到100000以内的整数,a、b必须是1到4的整数,a和b可以相等;
  ·输出必须有2*step+1个整数,每个步骤可以不换行;
  ·对于一次操作a,b,必须满足a塔有盘子,且当前状态下a塔最上面的盘子比b塔最上面的盘子(如果有)小,当然b塔没有盘子可以直接移动;
  ·step次操作完成后,所有的盘子从大到小放在第四个塔上;
  · XJJ请教大神得知n=30时,1025步可以通关,瞬间XJJ放心了不少。

 

 

(4)2的次幂表示

问题描述

  任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
  现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入格式

  正整数(1<=n<=20000)

输出格式

  符合约定的n的0,2表示(在表示中不能有空格)

样例输入

137

样例输出

2(2(2)+2+2(0))+2(2+2(0))+2(0)

样例输入

1315

样例输出

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示

  用递归实现会比较简单,可以一边递归一边输出

(5)

问题描述

Alice是一个让人非常愉跃的人!他总是去学习一些他不懂的问题,然后再想出许多稀奇古怪的题目。这几天,Alice又沉浸在逆序对的快乐当中,他已近学会了如何求逆序对对数,动态维护逆序对对数等等题目,他认为把这些题让你做简直是太没追求了,于是,经过一天的思考和完善,Alice终于拿出了一道他认为差不多的题目:

有一颗2n-1个节点的二叉树,它有恰好n个叶子节点,每个节点上写了一个整数。如果将这棵树的所有叶子节点上的数从左到右写下来,便得到一个序列a[1]…a[n]。现在想让这个序列中的逆序对数量最少,但唯一的操作就是选树上一个非叶子节点,将它的左右两颗子树交换。他可以做任意多次这个操作。求在最优方案下,该序列的逆序对数最少有多少。

Alice自己已近想出了题目的正解,他打算拿来和你分享,他要求你在最短的时间内完成。

输入格式

第一行一个整数n。

下面每行,一个数x。

如果x=0,表示这个节点非叶子节点,递归地向下读入其左孩子和右孩子的信息,如果x≠0,表示这个节点是叶子节点,权值为x。

输出格式

输出一个整数,表示最少有多少逆序对。

样例输入

3
0
0
3
1
2

样例输出

1

数据规模与约定

对于20%的数据,n <= 5000。

对于100%的数据,1 <= n <= 200000,0 <= a[i]<2^31。

 

 

(6)试题 算法训练 Formurosa

<span style="color:#666666"><span style="background-color:#f5f5f5">问题描述
Byteland生物研究中心(BIBR)正在调查两种细菌的性质,这两种细菌分别被称为0和1.即便是在显微镜下,也很难分辨这两种细菌。实际上,科学家们能分辨它们的唯一途径是通过一种叫做Formurosa的植物。
如果科学家们把细菌样本分别放在Formurosa的每一片叶子上,那么这样就会激活一个复杂的反应。在这个反应中,Formurosa的颜色会根据一个细菌种类的逻辑运算公式而变化,这个算式可能非常复杂。其中包含常数,以及|(or)、&(and)、^(xor)三种运算符。若运算结果是0,则植株变红。否则,它将变蓝。
举例来说,如果Formurosa的反应是以下算式决定的:(((?^?)|?)&(1^?))。(“?”表示叶子,共四片叶子)当我们把0,1,0,0分别放在相应的叶子上,那么算式的结果是(((0^1)|0)&(1^0)) = 1. 于是植株变蓝。
科学家们共有n群细菌。他们不知道细菌的种类,只知道所有的细菌不可能种类全都相同。科学家们希望不断地用Formurosa检验,从而确定细菌的种类。在每一次检验时,每一片叶子上只能放置恰好一个样品,不过可以把同一群细菌放在多个叶子上——甚至可以用同一群细菌放满整棵植株!
不论细菌的种类(假设所有细菌种类不全相同),科学家们是否总是能确定每一群细菌的种类呢?
输入
第一行有一个整数n,代表细菌有n群。
第二行是一个描述反应的算式。第二行只包含以下字符:“0”,“1”,“?”,“|”,“&”,“^”,“(”,“)”。并且遵从以下语法:s → 0|1|?|(s|s)|(s&s)|(s^s)
输出
如果科学家们总是能确定每一群细菌的种类,输出“YES”(不包含引号)。
否则,输出“NO”(不包含引号)。
数据规模与约定
2 <= n <= 10^6。
算式不超过10^6个字符。
样例输入
2
(?^?)
样例输出
NO
样例输入
10
?
样例输出
YES
样例输入
2
((?^?)&?)
样例输出
YES</span></span>

(7)全排列

(79条消息) 【DFS深度优先搜索】—— 全排列_Breynald的博客-CSDN博客_深度优先搜索求全排列算法的方法

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半截詩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值