soj1678解題報告

 昨天沒事幹,本來切了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();

}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章