1030 完美数列(25)(25 分)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M<=m∗pM <= m * pM<=m∗p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 10510^{5}105)是输入的正整数的个数,p(<= 10910^{9}109)是给定的参数。第二行给出N个正整数,每个数不超过10910^{9}109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
解析
二分查找
完整代码:
AC:
#include<stdio.h>
#include<stdlib.h>
int array[100010];
int cmp(void *a, void *b){
return *(int*)a-*(int*)b;
}
int binary_search(int low, int high, long long key){
while(low+1<high){
int mid = (low+high)/2;
if(array[mid] <= key) low = mid;
else high = mid-1;
}
return low;
}
int main(){
int N, p;
scanf("%d %d", &N, &p);
for(int i=0; i<N; i++)
scanf("%d", array+i);
qsort(array, N, sizeof(int), cmp);
int max_count = -1;
for(int i=0; i<N; i++){
int count = binary_search(i, N, (long long)p*array[i]) - i+1;
if(max_count < count)
max_count = count;
}
printf("%d\n", max_count);
}