PAT 完美数列

给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M<=m*p,则称这个数列是完美数列。

现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

输入第一行给出两个正整数 N 和 p,其中 N(<=105)是输入的正整数的个数,p(<=109)是给定的参数。第二行给出 N 个正整数,每个数不超过109

输出格式:

在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入样例:

10 8
2 3 20 4 5 1 6 7 8 9

输出样例:

8
#二分法查询列表中第一个大于mp的数的位置,再 -1 就是最大的小于等于mp的数位置
def upper_boun(l,h,mp,c):
    while l <= h:
        mid=l+(h-l)//2
        if c[mid]<= mp:
            l=mid+1
        else:
            h=mid-1
    return l
a,b=map(int,input().split())
c=list(map(int,input().split()))
c.sort()    #升序
ma=0
for i in range(len(c)):
    k=upper_boun(i,len(c)-1,c[i]*b,c)
    ma=max(ma,k-i)
print(ma)

二分法,没毛病

原文地址:https://www.cnblogs.com/andrew3/p/12702643.html