昨天没事干,本来切了2道水题,可以oj又挂了就没交上。今天交WA了一次,因为一个参数写错了= =简单总结一下。
题目大意:
抽象出如下序列:
1, 1、1,2, 1、1、1,1、2,3....
第i串序列要么其和比前面的长,要么字典序比前面的大。
序列和显然从1,2,3,……,n。
序列长度为i时,其个数有
f[i] = f[i-1] + f[i-2] + ... + f[1] + f[0] ;
最左边为1的为f[i-1]个,最左边为2的为f[i-2],i的为f[0]。。
f[0] = f[1] = 1 ;
so f[i] = 1 << ( i - 1 ) ;
对于给定的n,首先确定其长度,然后dfs下去即可,保存一个二维数组可以替换掉dfs,要codejam了...附代码如下。。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/************************************************************************/
/* soj1678 */
/************************************************************************/
const int maxn = 33 ;
typedef unsigned sth ;
sth f[maxn] , n , ans[maxn] , cnt ;
void init()
{
int i ;
for( i = 2 , f[0] = f[1] = 1 ; i < maxn ; i++) f[i] = f[i-1] * 2 ;
}
void dfs(int len)
{
sth i , j = 1 ;
for( i = len-1 , j = 1 ; i >= 1 ; i--,j++)
{
if( n <= f[i] ) break;
if( n > f[i] ) n -= f[i] ;
}
if( n == f[i] ) {
ans[cnt++] = j ; ans[cnt++] = i ; }else {
ans[cnt++] = j ; dfs(len-j); }}
inline void solve()
{
sth i , j ;
cnt = 0 ;
for ( i = 1 ; i < maxn ; i++)
{
if( n > f[i] ) n -= f[i] ;
else if( n <= f[i] ) break ;
}
if( n < f[i] ) dfs(i);
else ans[cnt++] = i ;
for( i = 0 ; i < cnt ; i++)
{
for( j = 0 ; j < ans[i] ; j++)
putchar('/');
for( j = 0 ; j < ans[i] ; j++)
putchar('\\');
}
puts("");
}
int main()
{
init();
while (~scanf("%u",&n),n) solve();
}