本文主要是介绍2017.6.4 入门组 NO.1——k好数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
方法①数据1<=n<=1000000,时间复杂度最大O(1000000*6)暴力足够了,于是,便开始码暴力:循环枚举i,将i转为字符串,每一位的判断是否超过k:如果每一位都没超过就+1方法②动态规划找一找每一位于上一位的关系,可以发现。设n=236,k=5,如果最后一位的数x大于k,则上一位数,只能取3+1种,所以(k+1)*f[i-1]设n=234,k=5,如果最后一位x小于或等于k,则上一位数,能取x种,所以g+x*k
方法①代码:
var n,k,i,j,o,l:longint;s:string;
beginreadln(n,k);for i:=1 to n dobeginstr(i,s);o:=0;for j:=1 to length(s) doif ord(s[j])-48>k thenbegino:=1; break;end;if o=0 then inc(l);end;write(l);
end.
方法②代码:
var n,k,x,g,f:int64;
beginreadln(n,k);f:=1;g:=1;while n>0 dobeginx:=n mod 10; n:=n div 10;if x>k then g:=f*(k+1)else g:=g+f*x;f:=f*(k+1);end;write(g-1);
end.
这篇关于2017.6.4 入门组 NO.1——k好数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!