1085. Perfect Sequence (25)
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 9
Sample Output:
8
#include<iostream> #include<vector> #include<cstdio> #include<algorithm> using namespace std; int main(){ int n,p; scanf("%d%d",&n,&p); vector<long>vt; int i,j,val; for(i=0;i<n;i++){ scanf("%ld",&val); vt.push_back(val); } sort(vt.begin(),vt.end()); int left=1,right=0; int length=0; int len=0; for(i=0;i<n;i++){ long tmp = p*vt[i]; if(tmp>=vt[n-1]){ if(len < n-i){ len=n-i; } break; } int right=n-1; while(right>left){ int mid=(right+left)/2; if(vt[mid]>tmp){ right=mid; }else if(vt[mid]<tmp){ left=mid+1; }else { left=mid+1; break; } } if(left-i>len){ len=left-i; } } printf("%d\n",len); return 0; }