pat 1085 Perfect Sequence (25) 二分查找

来源:互联网 发布:多益网络行政面试 编辑:程序博客网 时间:2024/06/01 07:21

题意

给我们一个数串 让我们从中挑选数字 构成一个集合
使得集合中最小元素m和最大元素M 满足 m*p>=M
求出集合的最大数量

分析

看下条件就可以发现 m*p >=M
也就是在数串中找m*p>=x
x的上界
那么排下序二分找即可

code

#include<bits/stdc++.h>using namespace std;typedef long long ll;int a[100010];int main(){    ll n,p;    scanf("%lld%lld",&n,&p);    for(int i=1;i<=n;i++)        scanf("%d",&a[i]);    sort(a+1,a+1+n);    int ans=0;    for(int i=1;i<=n;i++){        ll lim = a[i]*p;        int l=1,r = n,mid;        while(l<=r){            mid = l+r>>1;            if(lim>=a[mid])l = mid+1;            else r = mid-1;        }        l = min(l,(int)n+1);        ans = max(ans,l-i);     }    printf("%d\n",ans);    return 0;} 
原创粉丝点击