题目
链接:https://www.nowcoder.com/questionTerminal/a19f8670d25d444ab9e2f5601e1143ce?answerType=1&f=discussion
来源:牛客网
现在有q个询问,每次询问想问你在[l,r]区间内,k进制表示中,k-1的数量最多的数是哪个数。比如当k=2时,9的二进制就是1001,那么他就有2个1.
输入描述:
第一行一个q,表示有q组询问。
接下来q行,每行三个整数k,l,r,分别表示进制数,查询的数字,以及查询的范围。
满足1<=q<=100000,2<=k<=16,1<=l<=r<=10^16
输出描述:
对于每组询问,输出答案。如果有多个答案,请输出最小的。
示例1
输入
1
8 1 100
输出
63
思路
没有想到或者找到比较巧妙的思路,只有比较耗时耗力的做法,大神的代码主函数没看懂
技巧
1.将一个数字转化成k进制,使用“队列”
from collections import deque
def ToK(num,k):
res = deque()
while num:
res.appendleft(num%k)
num //= k
return list(res)
2.将k进制转化成十进制
from collections import deque
def Tonum(res,k):
ans = 0
temp = 1
for i in range(len(res)-1,-1,-1):
ans += res[i] *temp
temp *= k
return ans
lic代码
from collections import deque
from math import pow
q = int(input())
def ToK(num,k):
res = deque()
while num:
res.appendleft(num%k)
num //= k
return list(res)
def Tonum(res,k):
ans = 0
temp = 1
for i in range(len(res)-1,-1,-1):
ans += res[i] *temp
temp *= k
return ans
for i in range(q):
k, l, r = tuple(map(int, input().split()))
ans = l
lk = ToK(l,k)
cankao = 0
for m in lk:
if m == k-1:
cankao+=1
for j in range(l,r+1):
jk,cankaoj = ToK(j,k),0
# for m in jk:
# if m == k-1:
# cankaoj+=1
cankaoj = jk.count((k-1))
# if m == k-1:
# cankaoj+=1
if cankaoj>cankao:
cankao = cankaoj
ans = j
print(ans)
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为20.00%
大佬代码
链接:https://www.nowcoder.com/questionTerminal/a19f8670d25d444ab9e2f5601e1143ce
来源:牛客网
q = int(input())
from collections import deque
def ToK(num,k):
res = deque()
while num:
res.appendleft(num%k)
num //= k
return list(res)
def Tonum(res,k):
ans = 0
temp = 1
for i in range(len(res)-1,-1,-1):
ans += res[i] *temp
temp *= k
return ans
for i in range(q):
k, l, r = tuple(map(int, input().split()))
record, tmp = 0, 0
while tmp <= r:
record = tmp
tmp = tmp * k + (k - 1)
if record >= l:
print(record)
else:
low_k = ToK(l,k)
for i in reversed(range(len(low_k))):
if low_k[i] == k-1:
continue
else:
change = low_k[i]
low_k[i] = k-1
if Tonum(low_k[:],k) > r:
low_k[i] = change
break
print(Tonum(low_k[:],k))
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为86.67%