(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博客_深度优先搜索求全排列算法的方法