題意:P(x)=x各個數(shù)字位的乘積。x<=10^1000,求min{ans|ans>x && P(ans)=P(x)}。
顯然如果x的數(shù)字位含有0,分兩種情況:
1):只有一個0,如果0在個位數(shù),那么x+10就是最優(yōu)解了。如果0不在個位數(shù),則x+1就是最優(yōu)解。
2):有2個或2個以上的0,那么x+1就是最優(yōu)解。
證明略,很容易看出的。
接下來就是處理不含0的情況。
把x的各個數(shù)字位分解質(zhì)因子。只有2,3,5,7這4個素數(shù)。
然后從高位深搜解,這里有加些剪枝。就是在搜索的時候每步都有保證搜到的解>=x。這樣的話就會很快的搜到最優(yōu)解。具體實現(xiàn)就是設(shè)一個flag值,flag為真表示當(dāng)前搜的解>x否則=x。如果flag為真,則改數(shù)字位從1開始搜到9,如果flag不為真,則改狀態(tài)的數(shù)字位從x原本的數(shù)字位開始搜,只要碰到改狀態(tài)的數(shù)字大于原本的數(shù)字位就要改flag為真。這樣就可以保證比較快的搜到解了。然后隨便在了點雜七雜八的剪枝就差不多了。
最后還要在判斷剛才的搜索有沒有找到解,如果沒有找到解,那么只剩一種情況了,就是增加一個數(shù)字位'1';排序,輸出。
我的搜索已經(jīng)寫的很暴力了,str函數(shù)狂用,用時10ms。
不知道有沒有更高效的做法,或者有直接更妙的構(gòu)造方法呢?
——by yayamao