1085 Perfect Sequence (25 分)
题意
给出一组N个数,要你找出其中一些数组成一个序列,这个序列满足
序列中的最大值小于等于最小值乘以p(p由输入给出),且这个序列包含的数最多。求这个序列包含多少个数。
N<10^5
每个数不超过10^9
思路
考虑到数据量,从小到大排序,遍历数组,二分找到满足使当前数是最小值时的极限最大值。
二分时注意左右边界,考虑好最后的边界情况。
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
long long int numbers[100007],p;
int function(int m,int n)
{
int mid,left,right;
left=m+1;
right=n-1;
while(left<=right){
mid=(left+right)/2;
if(numbers[mid]<=numbers[m]*p){
left=mid+1;
}else{
right=mid-1;
}
}
return right-m;
}
int main()
{
int n,x,ans=0;
scanf("%d%lld",&n,&p);
for(int i=0;i<n;i++){
scanf("%lld",&numbers[i]);
}
sort(numbers,numbers+n);
for(int i=0;i<n;i++){
x=function(i,n);
if(x>ans){
ans=x;
// printf("number=%d\n",numbers[i]);
}
}
printf("%d\n",ans+1);
return 0;
}