之前题目记错了。下面更正一下 解题思路:对于上面的例子,可以这样来划分区间 各个子区间除了各位其他各位数字相同,所以含“9”最多的且在相同数目中最小的一定在下面这些数字中 29,39,49,……,259,260 那么最终的结果一定在下面两者中取:2~25中“9”的个数最多且最小的那个数乘以10加上9、267. 选取的标准是那个数中9最多。 如果右边界恰好是259的话,就直接是:2~25中“9”的个数最多且最小的那个数乘以10加上9 这便形成了简单的递归思路。为了简单起见我对原来的代码做了小幅的修改,代码很丑不要见怪。 代码如下: int getnumber(int k,int l,int r){     //cout<<l<<" "<<r<<endl;     if(r<k-1)return l;//直接返回最小的l     l=l/k;     if(r%k==k-1)     {         r=r/k;         return getnumber(k,l,r)*k+(k-1);     }     else //if(r%k!=k-1)     {         r=r/k-1;         int a=r*k,b=getnumber(k,l,r)*k+k-1; //在其他参数传递的方式下countk(k,b)不用再计算一遍         return countk(k,a)>countk(k,b)?a:b;//在相等的情况下应选择b,因为b更小     } }
点赞 评论

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务