1030 完美数列(二分解法)
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1030 完美数列(二分解法)相关的知识,希望对你有一定的参考价值。
1. 将整型序列从小到大排序后,这道题的本质是,对于每一个元素i,找出最后一个满足p*A[i]>=A[j]的元素j,可以转化为找出第一个不满足p*A[i]>=A[j]也即p*A[i]<A[j]的元素j。再用j-1。
2.LL product = (LL)p*A[i];这里后面两个乘子都是整型,如果不加强制转换,会扣两分。
3.还有就是要注意二分区间的范围,如果采用上面那种思路,下限应该是当前最小元素下标,上限应该是数组的长度,而不是长度减一。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100010;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;
LL Map[128];
int A[maxn];
int binarySearch(int A[],int l,int r,LL min){
int mid;
while(l<r){
mid = (l+r)/2;
if(A[mid]>min){//查找第一个不满足条件的元素,减1就是最后一个满足条件的元素
r = mid;
}else{
l = mid+1;
}
}
return l-1;
}
int main(){
int N,p;
scanf("%d%d",&N,&p);
for(int i=0;i<N;i++){
scanf("%d",&A[i]);
}
sort(A,A+N);
int res = 0;
for(int i=0;i<N;i++){
LL product = (LL)p*A[i];
int tail = binarySearch(A,i,N,product);//N不可以是N-1
int longest = tail - i +1;
if(longest>res)res = longest;
}
printf("%d",res);
return 0;
}
以上是关于1030 完美数列(二分解法)的主要内容,如果未能解决你的问题,请参考以下文章