您的位置:首页 > 产品设计 > UI/UE

pat 1085 Perfect Sequence (25) 二分查找

2017-12-09 11:46 477 查看

题意

给我们一个数串 让我们从中挑选数字 构成一个集合

使得集合中最小元素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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分查找