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
原题链接:
https://www.patest.cn/contests/pat-a-practise/1085
https://www.nowcoder.com/pat/5/problem/4035
思路:
排序+二分查找
坑点:
PAT上最后一个数据点要用longlong
CODE:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define N 100010
using namespace std;
long long num[N];
int main()
{
int n;
long long p;
scanf("%d %ld",&n,&p);
for (int i=0;i<n;i++)
scanf("%ld",&num[i]);
sort(num,num+n);
int mx=0;
for (int i=0;i<n;i++)
{
if (i>=n-mx) break;
int l=i;
int r=n-1;
int mid;
while (l<=r)
{
mid=(l+r)/2;
if (num[mid]>num[i]*p)
{
r=mid-1;
}
else
{
l=mid+1;
}
}
mx=max(mx,l-i);
}
cout<<mx;
return 0;
}