题意:寻找最长的完美序列,也就是一串数字中的min*q>=max
先排序,然后枚举起点a[i]*q,在序列中寻找第一个大于乘积的数的下标,然后减去i,取MAX,这个寻找的过程采用二分
- 注意点:
1.最大值只有一个,但是最大值可能出现了多次,所以我们不用lower_bound函数而是用upper_bound函数,最大值都放在这个序列,这样长度就会更长
2.忽略了相乘的结果的类型,p是不超过10^9,但是相乘可能超过了,所以类型转换成long long类型
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAX=1e6+10;
int n;
ll m,a[MAX];
int bsearch(ll a[],int left,int right,ll k)
{
int mid;
while(left<right)
{
mid=left+right>>1;
if(a[mid]>k)
right=mid;
else
left=mid+1;
}
return left;
}
int main()
{
int Max=0;
cin>>n>>m;//最小值乘以m大于最大值
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(int i=0;i+Max<n;i++)
{
int t=bsearch(a,i,n,a[i]*m);
//寻找第一个大于a[i]*n的数,在序列中的下标
Max=max(Max,t-i);
}
cout<<Max;
return 0;
}