pat 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 9Sample Output:
8
这道题目,在时间上,就考察一个二分查找。还有就是一个long long因为乘法有可能超过int
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
vector<long long> nums;
int bSearch(long long num,int n)
{
int l = 0,r = n-1,mid;
while(l<=r)
{
mid = (l+r)/2;
if(nums[mid]>num)
{
r = mid-1;
}else if(nums[mid]<num)
{
l = mid+1;
}else
{
return mid;
}
}
return l;
}
int main()
{
long long n,p,tmp1,m,index;
long long i,j,tmpMax=0,resMax;
scanf("%lld%lld",&n,&p);
for(i=0;i<n;i++)
{
scanf("%lld",&tmp1);
nums.push_back(tmp1);
}
sort(nums.begin(),nums.end());
for(i=0;i<n;i++)
{
m = nums[i]*p;
index = bSearch(m, n);
if(nums[n-1]<=m)
{
tmpMax = n-1-i+1;
}else
{
tmpMax = index-i;
}
if(tmpMax>resMax)
{
resMax = tmpMax;
}
}
printf("%lld\n",resMax);
return 0;
}