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

#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; }
}

FZU 1064 教授的测试(卡特兰数,递归)的更多相关文章

  1. FZU 1064 教授的测试

    递归构造答案. 根据当前整颗树的编号,可以计算左右子树有几个节点以及编号.因此,不断dfs下去就可以了. #include<cstdio> #include<cstring> ...

  2. poj 1095 题解(卡特兰数+递归

    题目 题意:给出一个二叉树的编号,问形态. 编号依据 1:如果二叉树为空,则编号为0: 2:如果二叉树只有一个节点,则编号为1: 3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编 ...

  3. HDU-4828 卡特兰数+带模除法

    题意:给定2行n列的长方形,然后把1—2*n的数字填进方格内,保证每一行,每一列都是递增序列,求有几种放置方法,对1000000007取余: 思路:本来想用组合数找规律,但是找不出来,搜题解是卡特兰数 ...

  4. FZU 2098 刻苦的小芳(卡特兰数,动态规划)

    Problem 2098 刻苦的小芳 Accept: 42 Submit: 70 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Descr ...

  5. 【8.19校内测试】【背包】【卡特兰数】【数位dp】

    早上随便搞搞t1t3就开始划水了,t2一看就是组合数学看着肚子疼...结果t1t3都a了??感天动地. 从小到大排序,从前到后枚举i,表示i是整个背包中不选的物品中代价最小的那个,即i不选,1到i-1 ...

  6. 栈 && 教授的测试

    卡特兰数:https://blog.csdn.net/wu_tongtong/article/details/78161211 https://www.luogu.org/problemnew/sho ...

  7. 卡特兰数(Catalan)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...

  8. 卡特兰数 (Catalan)

    卡特兰数:(是一个在计数问题中出现的数列) 一般项公式: 1.         或       2.   递归公式: 1.  或 2. 注:全部可推导. (性质:Cn为奇数时,必然出现在奇数项 2k- ...

  9. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

随机推荐

  1. 修改Java标准库源码

    以下是摘抄,实际操作没有测试   先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Cla ...

  2. 【Java面试题】7 构造器Constructor是否可被override?

    构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload. Constructor不能被继承,所以Constructor也就不能被override.每一个类必 ...

  3. chrome浏览器默认启动时打开2345导航的解决方法

    2345并没有改动chrome内部设置.它仅仅是把全部的快捷方式改动了.包含開始菜单旁边的快捷启动图标. 仅仅须要右键chrome快捷方式.在目标一栏中,把"----chrome.exe&q ...

  4. link with editor

    在左侧explore上,有个双向的箭头,点一下,就会把路径和当前文件自动对应

  5. 彩色图像的直方图均衡化matlab代码

    彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...

  6. Java精选笔记_JSP开发模型

    JSP开发模型 JSP Model JSP Model1简单轻便,适合小型Web项目的快速开发. JSP Model2模型是在JSP Model1的基础上提出的,它提供了更清晰的代码分层,更适用于多人 ...

  7. Extjs学习笔记--(六,选择器)

    文档对象dom是javascript与页面元素的桥梁 选择器的作用就是通过元素的标签名,属性名,css属性名对页面进行快速,准确的定位及选择 Extjs的选择器:Ext.DomQuery Ext.qu ...

  8. swift - UIAlertController 的用法

    ios 8 以后苹果官方建议使用UIAlertController这个类,所以专门去网上找资料,了解了下用法, 1.创建一个alertController let alertController = ...

  9. LVS+keeplived+nginx+tomcat高可用、高性能jsp集群

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://kerry.blog.51cto.com/172631/557749 #!/bin ...

  10. Android 多状态按钮ToggleButton

    1.什么是ToggleButtonToggleButton有两种状态:选中和未选中状态并且需要为不同的状态设置不同的显示文本2.ToggleButton属性android:checked=" ...