首页 > 代码库 > pat 1085. Perfect Sequence (25)
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(longlong 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;
- }
pat 1085. Perfect Sequence (25)