题意:
如果一个数它的每一位(除了最高最低位)都大于或小于它两边的数字 则这个数字叫波浪数 输入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