3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K
python
class Solution:
def findMaximumNumber(self, k: int, x: int) -> int:
def check(v):
A=list(map(int,bin(v)[2:]))
n=len(A)
res=p=0
for i,v in enumerate(A):
if v==1:
l=n-i-1
res+=(p<<l)+((l//x)<<(l-1) if l else 0)
if (n-i)%x==0:
p+=v
return res+p
l,r=1,10**15
while l<r:
mid=(l+r+1)//2
if check(mid)<=k:
l=mid
else:
r=mid-1
return l
p记录的是前面有几位可以是1
l表示空闲位
l//x表示空闲位中可以为1,位的个数
(l-1)表示当其中一位设置为1,剩余位的个数
这里会重复枚举数字,但是每个为1的位只算了一次