Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
7614586 | kingpro | 1095 | Accepted | 172K | 0MS | C++ | 771B | 2010-09-14 05:44:37 |
#include<stdio.h>
#define MAXN 19
int num[MAXN]={1,1}, snum[MAXN]={1,1}, n;
void GetMum(int n){ for(int i=0; i<n && (num[n]+=num[i]*num[n-1-i]) || (snum[n]=snum[n-1]+num[n],false); i++); }
void SplitNum(int offset, int l)
{
for(int cnt=0, i=0, offsetall=0, ni=0;
i<l && (cnt+=num[i]*num[l-1-i], cnt<offset) ||
(ni=l-1-i, offsetall=offset-cnt+num[i]*num[ni]-1,
i!=0 && (printf("("), SplitNum(offsetall/num[ni]+1, i), printf(")")),
printf("X"),
ni!=0 && (printf("("), SplitNum(offsetall%num[ni]+1, ni),printf(")")),
false);
i++);
}
int main()
{
for(int i=2; i<MAXN && (GetMum(i), true); i++);
while(scanf("%d", &n), n!=0)
for(int i=1; i<MAXN && (snum[i]<n) || (SplitNum(n-snum[i-1], i), printf("\n"), false); i++);
return 0;
}
这道题在POJ上AC率很高...主要是这道题,对错与否实在是太容易看出来了,过了测试用例基本就对了,但是Submit数量才5000不到,不是很难,但是题意蛮难理解的,特别是那句“Any binary tree having m nodes with left and right subtrees L and R is numbered n such that all trees having m nodes numbered > n have either Left subtrees numbered higher than L, or A left subtree = L and a right subtree numbered higher than R.”,这么长,完全晕掉。。。
题意大概是:用一棵二叉树表示数字;节点多的二叉树表示的数字总比节点少的二叉树表示的数字大;一个父节点上的左右子节点,右节点总比左节点小。
给定一个数,输出对应二叉树的中序遍历表达式。
分析:一棵树有m个节点,那么他可能表示的数字的数量为:F(m)=Σ[i=0, m-1] F(i)*F(m-1-i),题目中给的数1 <= n <= 500,000,000,预计算 m最大为19。
解决方法:递归;给定一个数字n,先确定二叉树的节点数量m,进而分裂,确定左子树和右子树的节点数量i j和对应的值(实际使用偏移量),m=i+j+1。
值得一做的题。