CodeForces 478E Wavy numbers
題意:
如果一個數它的每一位(除了最高最低位)都大於或小於它兩邊的數字 則這個數字叫波浪數 輸入n和k (10^14) 求%n==0的第k小的波浪數 如果沒有或者大於10^14就輸出-1
思路:
這也算是一種分治的搜索策略吧 meet-in-mid
由於數字最多14位 因此可以暴力高7位和低7位(均為80+w種) 然後枚舉高位和低位去拼
這題對於代碼書寫要求較高!! 我的方法如下:
暴力高7位
暴力低7為 放進vector 同時記錄對於一個number 它的首位 和 首位與第二位大小情況(為了拼接) 同時做一個hash 記錄cnt[i][j][k] 其中i為number首位 j為0或1表示首位與第二位大小情況 k為number%n的余數的hash值(為了方便查找)cnt記錄ijk情況的number個數
然後開始尋找答案
枚舉高7位的number 表示只有不用拼接的情況
判斷n是否大於等於10^7 如果是 那麼只要i=n開始不斷的+n就可以找數字了
如果不是 枚舉高7位 再枚舉低7位的首位 利用剛才記錄的cnt不斷的使k減小 直到確定了高7位後 暴力低7位拼答案
注意:hash不能用map 會TLE 在叉姐的提醒下我改成了離散再hash(因為種類不多!!) 現在是CF上跑的最快的代碼哈哈哈哈哈哈哈~~~
代碼:
#include
#include
#include
#include
#include
#include