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 完美数列(二分解法)的主要内容,如果未能解决你的问题,请参考以下文章

PAT二分查找---1030 完美数列 (25分)

1030 完美数列 (二分法upper_bound)

1030 完美数列 (25 分)(滑动窗口)

1030 完美数列 (25分)

PAT乙级1030

PAT 1030. 完美数列