• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            集訓專題訓練1::搜索 福大校賽 G 整除45問題,狀態空間搜索

            五月份做的吧 那個時候用了dp 死活過不了 后來聽人說dp是可行的 但我還是不會,囧。。。這題用了比較快的廣搜算法,用v[i][j][k]存儲余數從i->j,去掉數字為k的情況,由于狀態空間<1000,所以窮搜狀態空間是可行的。這題具體來說可以分成三種情況:
            1.字符串中既沒有5也沒有0,那么可以直接impossble掉
            2.如果字符串中有5但是沒有0,可以先去掉一個5,然后在窮搜,最后在末尾添加上。
            3.其他情況,只要有0,末尾一定是0。
            代碼如下:
            #include<iostream>
            #include
            <algorithm>
            #include
            <cmath>
            #include
            <cstring>
            using namespace std;

            struct node
            {
                
            int num[10];
                
            int r;
            }
            q[1010];

            int getd(int num[])//統計這個大數的位數
            {
                
            int ans=0;
                
            for(int i=0;i<10;i++)
                
            {
                    ans
            +=num[i];
                }

                
            return ans;
            }

            int getsum(int num[])//統計這個大數每位之和
            {

                
            int ans=0;
                
            for(int i=0;i<10;i++)
                
            {
                    ans
            +=num[i]*i;
                }

                
            return ans;
            }



            int v[11][11][11];//hash判重
            int num[10];//初始大數
            int flagnum[10];
            char s[2000];//字符串
            int t;
            bool haszero;//有0嗎?
            bool hasfive;//有5嗎?

            int ansnum[10];//最終結果,有中間處理,注意加0加5的情況
            int ansflag;
            int cmp(int ansnum[],int num[])
            {

                
            int len1=getd(ansnum);
                
            int len2=getd(num);

                
            //特別處理一下兩個數是全0的情況
                if(getsum(ansnum)==0&&getsum(num)==0)
                    
            return 0;
                
            else if(getsum(ansnum)==0&&getsum(num)!=0)
                    
            return -1;
                
            else if(getsum(ansnum)!=0&&getsum(num)==0)
                    
            return 1;
                
            //end

                
            if(len1>len2)
                    
            return 1;
                
            else if(len1<len2)
                    
            return -1;
                
            else
                
            {
                    
            int i;
                    
            for(i=9;i>=1;i--)
                    
            {
                        
            if(ansnum[i]>num[i])
                            
            return 1;
                        
            else if(ansnum[i]<num[i])
                            
            return -1;
                    }

                    
            return 0;
                }

            }


            void copy(int t[],int s[])//copy s里面的東西到t 
            {
                
            int i;
                
            for(i=0;i<=9;i++)
                    t[i]
            =s[i];
            }

            void input()//從1開始存儲
            {
                ansflag
            =0;
                hasfive
            =haszero=0;
                scanf(
            "%s",s+1);
                memset(ansnum,
            0,sizeof(ansnum));
                memset(num,
            0,sizeof(num));
                memset(v,
            0,sizeof(v));
                
            int i;
                
            int len=strlen(s+1);
                
            for(i=1;i<=len;i++)
                
            {
                    
            int tt=(s[i]-'0');
                        num[tt]
            ++;
                    
            if(tt==0)
                        haszero
            =1;
                    
            if(tt==5)
                        hasfive
            =1;
                }

            }


            void output(int num[])//沒有加回車,注意預先去掉的數字
            {

                
            for(int i=9;i>=0;i--)
                
            {

                    
            if(num[i]!=0)
                        
            for(int j=1;j<=num[i];j++)
                            printf(
            "%d",i);
                }

            }


            int main()
            {
                
            int t;
                scanf(
            "%d",&t);
                
            while(t--)
                
            {
                    input();
                    
            if(!haszero&&!hasfive)
                    
            {
                        printf(
            "impossible\n");
                        
            continue;
                    }

                    
            /*
                    if(haszero&&!hasfive)
                    {

                        int l,r;
                        l=r=1;
                        copy(q[1].num,num);
                        int tem=getsum(q[1].num);
                        tem%=9;
                        q[1].r=tem%9;
                        v[tem][tem][0]=1;
                        while(l<=r)
                        {
                            if(cmp(q[l].num,ansnum)==1&&q[l].r==0)
                            {
                                ansflag=1;
                                copy(ansnum,q[l].num);
                            }


                            for(int i=1;i<10;i++)
                            {
                                int nr=(q[l].r-i+9)%9;
                                if(q[l].num[i]>0&&v[q[l].r][nr][i]==0)
                                {
                                    r++;
                                    copy(q[r].num,q[l].num);
                                    q[r].num[i]--;
                                    q[r].r=nr;
                                    v[q[l].r][nr][i]=1;
                                }
                            }
                            l++;
                        }

                        if(ansflag==1)
                        {
                            output(ansnum);
                            printf("\n");
                        }
                        else
                            printf("0\n");
                    }
                    
                    
            */


                    
            else if(!haszero&&hasfive)//沒有0但是有5
                    {

                        
            int l,r;
                        l
            =r=1;
                        copy(q[
            1].num,num);
                        q[
            1].num[5]--;
                        
            int tem=getsum(q[1].num);
                        q[
            1].r=tem%9;
                        tem
            %=9;
                        v[tem][tem][
            0]=1;
                        
            while(l<=r)
                        
            {
                            
            if(cmp(q[l].num,ansnum)==1&&q[l].r==4)
                            
            {
                                ansflag
            =1;
                                copy(ansnum,q[l].num);
                            }


                            
                            
            for(int i=1;i<10;i++)
                            
            {
                                
            /*
                                if(i==5)
                                {
                                    __asm
                                    {

                                        int 3;
                                    }
                                }
                                
            */

                                
            int nr=(q[l].r-i+9)%9;
                                
            if(q[l].num[i]>0&&v[q[l].r][nr][i]==0)
                                
            {
                                    r
            ++;
                                    copy(q[r].num,q[l].num);
                                    q[r].num[i]
            --;
                                    q[r].r
            =nr;
                                    v[q[l].r][nr][i]
            =1;
                                }

                            }

                            l
            ++;
                        }


                        
            if(ansflag==1)
                        
            {
                            output(ansnum);
                            printf(
            "5\n");
                        }

                        
            else
                            printf(
            "impossible\n");
                    }

                    
            else //沒有0但是有5或者有0有5,情況相同
                    {

                        
            int l,r;
                        l
            =r=1;
                        copy(q[
            1].num,num);
                        
            int tem=getsum(q[1].num);
                        tem
            %=9;
                        q[
            1].r=tem%9;
                        v[tem][tem][
            0]=1;
                        
            while(l<=r)
                        
            {
                            
            if(cmp(q[l].num,ansnum)==1&&q[l].r==0)
                            
            {
                                ansflag
            =1;
                                copy(ansnum,q[l].num);
                            }



                            
            for(int i=1;i<10;i++)
                            
            {
                                
            int nr=(q[l].r-i+9)%9;
                                
            if(q[l].num[i]>0&&v[q[l].r][nr][i]==0)
                                
            {
                                    r
            ++;
                                    copy(q[r].num,q[l].num);
                                    q[r].num[i]
            --;
                                    q[r].r
            =nr;
                                    v[q[l].r][nr][i]
            =1;
                                }

                            }

                            l
            ++;
                        }


                        
            if(ansflag==1)
                        
            {
                            output(ansnum);
                            printf(
            "\n");
                        }

                        
            else
                            printf(
            "0\n");
                    }

                }

                
            return 0;
            }
            代碼寫的比較長比較猥瑣,不知道能把幾個廣搜合并下么。
            感謝messidou神牛指點。

            posted on 2010-07-03 10:58 abilitytao 閱讀(1560) 評論(0)  編輯 收藏 引用

            国产美女亚洲精品久久久综合 | 蜜桃麻豆www久久| 久久丫忘忧草产品| 亚洲日本va午夜中文字幕久久| 91精品国产高清久久久久久国产嫩草 | 国内高清久久久久久| 欧美久久亚洲精品| 欧美日韩中文字幕久久久不卡| 岛国搬运www久久| 精品国产一区二区三区久久蜜臀| 久久久久中文字幕| 亚洲午夜久久影院| 久久精品国产精品亚洲艾草网美妙 | 99久久精品国产一区二区| 99久久国产亚洲综合精品| 久久精品国产乱子伦| 伊人久久大香线蕉亚洲五月天| 99久久国产亚洲综合精品| 久久人人爽人人爽人人片AV东京热| 欧美与黑人午夜性猛交久久久 | 一本久久a久久精品亚洲| 99精品国产综合久久久久五月天| 亚洲狠狠婷婷综合久久久久| 久久久亚洲欧洲日产国码二区| 久久国产亚洲精品无码| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 成人妇女免费播放久久久 | 国产亚州精品女人久久久久久| 国产午夜福利精品久久| 久久综合狠狠综合久久97色| 久久久久久久精品成人热色戒| 久久婷婷五月综合97色| 国产激情久久久久影院| 久久午夜夜伦鲁鲁片免费无码影视 | 亚洲精品乱码久久久久久蜜桃图片 | 国产偷久久久精品专区| WWW婷婷AV久久久影片| 久久久久国产亚洲AV麻豆| 久久亚洲精品人成综合网| 久久青青草原精品国产软件| 亚洲午夜久久久久久久久电影网|