B1085 Perfect Sequence(二分)

题意:寻找最长的完美序列,也就是一串数字中的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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容