patA1085 完美数列(25)

42 篇文章 0 订阅
7 篇文章 0 订阅

注意点:int*int 最大值可能达到10^18

暴力解决的时间复杂度肯定超时。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100001;
int num[maxn];
int binarySearch(int i,int n,long long x){   //logn
// int mid=(i+n)/2;
int l=i+1,r=n-1,mid;
if(num[r]<=x) return n;
while(l<r){
   mid=(l+r)/2;
if(num[mid]<=x) l=mid+1;
else{
 r=mid;
}
}
return l;
}
int main(int argc, char** argv) {
int n,p;              //int*int may be out of boundary;
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++) scanf("%d",&num[i]);
sort(num,num+n);
int ans=1;
for(int i=0;i<n;i++){
int j=binarySearch(i,n,(long long)num[i]*p);  //每次从最小值走,寻找最大的<=第三个参数 
ans=max(j-i,ans);
}
printf("%d",ans);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值