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
题意为从数列中选出若干个数,使得这些数的最大值不超过最小值的p倍,满足要求的最大的数的个数。
使用upper_bonder函数返回数组中第一个大于a[i]*p的位置,然后求出j-i的最大值即可
#include <cstdio>
#include <algorithm>
using namespace std;
int a[100010];
int main()
{
int n,p;
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&p);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
sort(a,a+n);
int ans=1;
for(int i=0;i<n;++i)
{
int j=upper_bound(a+i+1,a+n,(long long)a[i]*p)-a;
ans=max(ans,j-i);
}
printf("%d\n",ans);
}
return 0;
}
方法二:two ponters.
#include <cstdio>
#include <algorithm>
using namespace std;
int num[100020];
int main()
{
int n,p,m,M;
while(scanf("%d%d",&n,&p)!=EOF)
{
for(int i=0;i<n;++i)
{
scanf("%d",&num[i]);
}
sort(num,num+n);
int i=0,j=0,count=1; //i,j记录最小和最大值的指针
while(i<n&&j<n)
{
while(j<n&&num[j]<=(long long)num[i]*p) //判断条件,注意两数相乘可能超过int范围,固应转换为long long型
{
count=max(count,j-i+1);
j++;
}
i++;
}
printf("%d\n",count);
}
return 0;
}