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
这一题思路肯定是排序,我的思路是先确定最大值(根据位置,所以要先排序),然后去找对应的最小值的位置,最后位置减一减+1就是答案了。
这里找最小值的位置不能用遍历,会超时,要用二分查找。并且因为它相乘会超int的范围,所以确立最小值都不需要定义longlong
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
vector<int> v;
int BinarySearch(int left,int right,int x){
while(left < right){
int mid = (left + right)/2;
if(v[mid]<x){
left=mid+1;
}
else if(v[mid]>x){
right=mid-1;
}
else return mid;
}
return left;
}
int main(){
int n,p;
cin>>n>>p;
for(int i=0;i<n;i++){
int tmp;
cin>>tmp;
v.push_back(tmp);
}
sort(v.begin(),v.end());
int cnt=1;
for(int i = n - 1; i >= 0; i--){
if(v[i]>=p){
int j=BinarySearch(0,i,(int)(v[i]/p + 1));
cnt=max(cnt,i-j+1);
}
}
cout<<cnt;
return 0;
}