1. 程式人生 > >JZYZOJ1237 教授的測試 dfs

JZYZOJ1237 教授的測試 dfs

技術 span using gif cnblogs namespace std closed print

http://172.20.6.3/Problem_Show.asp?id=1237

鍛煉搜索的代碼能力,不錯的題。 開始對dfs到底向下傳遞什麽搞不清楚,需要想一下,noip難度的題還有這種情況,果然還是太蒻。 代碼 技術分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<vector>
 8 using
namespace std; 9 int n; 10 int f[30]={}; 11 int mm[30][2]={},tot; 12 void init(int x,int siz,int xu){ 13 if(siz==0||siz==1)return; 14 int w=xu,z; 15 for(int i=0;i<siz;i++){ 16 if(w>f[i]*f[siz-1-i])w-=f[i]*f[siz-1-i]; 17 else{z=i;break;} 18 } 19 int zz2=w%f[siz-1
-z]; 20 int zz1=w/f[siz-1-z]+1; 21 if(zz2==0){zz2=f[siz-1-z];zz1-=1;} 22 if(z!=0){mm[x][0]=++tot;init(tot,z,zz1);} 23 if(siz-1-z!=0){mm[x][1]=++tot;init(tot,siz-1-z,zz2);} 24 } 25 void put(int x){ 26 if(mm[x][0]){printf("(");put(mm[x][0]);printf(")");} 27 printf("X"); 28 if(mm[x][1
]){printf("(");put(mm[x][1]);printf(")");} 29 } 30 int main(){ 31 int ma=100000000; 32 f[1]=1;f[0]=1; 33 for(int i=2;f[i-1]<ma;i++){ 34 for(int j=0;j<=(i-1)/2;j++){ 35 f[i]+=f[j]*f[i-1-j]*2; 36 if(j==i-1-j){ 37 f[i]-=f[j]*f[i-1-j]; 38 } 39 } 40 } 41 while(~scanf("%d",&n)){ 42 if(n==0)break; 43 memset(mm,0,sizeof(mm)); 44 tot=1;int siz; 45 int q=0; 46 for(int i=1;;i++){ 47 q+=f[i]; 48 if(n<=q){siz=i;q-=f[i];break;} 49 } 50 init(1,siz,n-q); 51 put(1); 52 cout<<endl; 53 } 54 return 0; 55 }
View Code

JZYZOJ1237 教授的測試 dfs