FZU 1064 教授的测试(卡特兰数,递归)
2016-03-18 13:19
197 查看
Problem 1064 教授的测试
Accept: 149 Submit: 364
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
一年一度的研究生面试又快要来临了。为了测试学生对树结构的认识,同时也检验他们的编程能力,福州大学计算机系把面试的一项内容定为:要求学生们编程按编号顺序打印出节点个数不少于m的所有二叉树。
二叉树编号规则如下:
仅有一个节点的树编号为1。
当满足以下条件之一时,定义二叉树a的编号比b大:
1. a的节点数比b多。
2. 若a的节点数与b相等,且a的左子树编号比b的左子树大。
3. a的节点数和左子树编号都和b相等,且a的右子树编号比b的右子树大。
二叉树的节点用大写X表示,例如:
当然当m较大时,检验答案对错的工作也是很繁重的,所以教授只打算对其中的若干个编号的二叉树进行抽查,他想麻烦你编制一个程序能够产生编号为n的二叉树的标准答案。
Input
输入数据由多组数据组成。每组数据仅一个整数,表示n (1≤n≤10^8)的值。输入数据以n=0表示结束,该数据不要处理。
Output
对于每组数据,输出仅一行,即你求出的标准答案。
二叉树的输出格式为:
(左子树){若左子树为空则省略}X{根}(右子树){若右子树为空则省略}
其中{…}中的内容是说明,不必输出。例如,在上图中编号为5的树可表示为X((X)X);编号为6的树表示为(X)X(X)。
Sample Input
20
0
Sample Output
((X)X(X))X
卡特兰数的应用。用递归直接输出。根据这个树排名,来确定左子树的节点个数和排名,以及右子树的节点个数和排名。
关于卡特兰数的应用总结,可以参考这篇博客
http://blog.csdn.net/dacc123/article/details/50922138
Accept: 149 Submit: 364
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
一年一度的研究生面试又快要来临了。为了测试学生对树结构的认识,同时也检验他们的编程能力,福州大学计算机系把面试的一项内容定为:要求学生们编程按编号顺序打印出节点个数不少于m的所有二叉树。
二叉树编号规则如下:
仅有一个节点的树编号为1。
当满足以下条件之一时,定义二叉树a的编号比b大:
1. a的节点数比b多。
2. 若a的节点数与b相等,且a的左子树编号比b的左子树大。
3. a的节点数和左子树编号都和b相等,且a的右子树编号比b的右子树大。
二叉树的节点用大写X表示,例如:
当然当m较大时,检验答案对错的工作也是很繁重的,所以教授只打算对其中的若干个编号的二叉树进行抽查,他想麻烦你编制一个程序能够产生编号为n的二叉树的标准答案。
Input
输入数据由多组数据组成。每组数据仅一个整数,表示n (1≤n≤10^8)的值。输入数据以n=0表示结束,该数据不要处理。
Output
对于每组数据,输出仅一行,即你求出的标准答案。
二叉树的输出格式为:
(左子树){若左子树为空则省略}X{根}(右子树){若右子树为空则省略}
其中{…}中的内容是说明,不必输出。例如,在上图中编号为5的树可表示为X((X)X);编号为6的树表示为(X)X(X)。
Sample Input
20
0
Sample Output
((X)X(X))X
卡特兰数的应用。用递归直接输出。根据这个树排名,来确定左子树的节点个数和排名,以及右子树的节点个数和排名。
关于卡特兰数的应用总结,可以参考这篇博客
http://blog.csdn.net/dacc123/article/details/50922138
#include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> #include <math.h> #include <stdio.h> using namespace std; long long int a[20]; long long int n; int tag; void fun(int num,int n) { if(n==0) return; if(n==1) {if(tag==1)cout<<"X"; else cout<<"(X)";return;} int num2=0; int i; for( i=0;i<20;i++) { num2+=a[i]*a[n-i-1]; if(num2>=num) break; } num2-=a[i]*a[n-i-1]; num-=num2;num--; if(n!=tag) cout<<"("; fun(num/a[n-i-1]+1,i); cout<<"X"; fun(num%a[n-i-1]+1,n-i-1); if(n!=tag) cout<<")"; } int main() { a[0]=1; for(int i=1;i<20;i++) a[i]=(a[i-1]*(4*i-2)/(i+1)); while(scanf("%lld",&n)!=EOF) { if(n==0) break; int i; int num3=0; for( i=1;i<20;i++) { num3+=a[i]; if(num3>=n) break; } num3-=a[i]; int num2=n-num3; tag=i; fun(num2,i); cout<<endl; } }
相关文章推荐
- 5成外国人认为韩国特色文化是“传统习惯”
- IE标准模式与兼容模式设置
- Android开源项目分类汇总
- WebAPI列子
- 16.复杂数据结构
- 201. Bitwise AND of Numbers Range | Java最短代码实现
- 【UVALive - 3713】Astronauts (2-SAT)
- svn 报错 Previous operation has not finished; run 'cleanup' if it was interrupted
- 第二周JAVA学习笔记(二)
- React-Native 写了个 Douban App
- CentOS之许可
- Fragment生命周期
- maven项目启动tomcat包丢失处理
- 用C#执行批处理并输出结果
- HDU 2111 Saving HDU
- 扫雷游戏
- UIView相关Updating constraints、Layout、Display一些知识
- angularJS过滤器date所接受的日期类型
- 蓝鲸学习日志~~~
- OpenStack(6) - 使用CLI