时间限制
300 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CAO, Peng
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
这道题目,在时间上,就考察一个二分查找。还有就是一个long long因为乘法有可能超过int
[cpp] view plaincopyprint?
- #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;
- }
#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; }