Given a sequence of positive integers and another positive integer p. The sequence is said to be a "perfect sequence" if M <= m * p where M and m are the maximum and minimum numbers in the sequence, respectively.
Now given a sequence and a parameter p, you are supposed to find from the sequence as many numbers as possible to form a perfect subsequence.
Input Specification:
Each input file contains one test case. For each case, the first line contains two positive integers N and p, where N (<= 105) is the number of integers in the sequence, and p (<= 109) is the parameter. In the second line there are N positive integers, each is no greater than 109.
Output Specification:
For each test case, print in one line the maximum number of integers that can be chosen to form a perfect subsequence.
Sample Input:10 8 2 3 20 4 5 1 6 7 8 9Sample Output:
8
//1085
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,p;
scanf("%d%d",&n,&p);
vector<long>seq;
seq.resize(n);
for(int i=0;i<n;++i)
scanf("%ld",&seq[i]);
sort(seq.begin(),seq.end());
int maxcount=0,down=1;
for(int i=0;i<n;++i)
{//reuse the answer 'down' can reduce the calculating time
long max=p*seq[i];
if(max>=seq[n-1])
{//if all the element behind i is smaller than max
//they all need to be counted and the loop could be stopped
maxcount=n-i>maxcount?n-i:maxcount;
break;
}
int up=n-1;
while(up>down)
{//binary search
int mid=(up+down)/2;
if(seq[mid]>max)
up=mid;
else if(seq[mid]<max)
down=mid+1;
else
{
down=mid+1;
break;
}
}
if(down-i>maxcount)
maxcount=down-i;
}
printf("%d\n",maxcount);
return 0;
}