1030 完美数列(two pointers解法)

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1030 完美数列(two pointers解法)相关的知识,希望对你有一定的参考价值。

1. 这道题出现在二分法,但是特殊之处在于,双指针是嵌套的,程序看上去有些像暴力枚举,但其实是利用了,如果i<j,a[i]*p>=a[j],那么一定有k在[i,j]范围内,a[i]*p>=a[k],以及a[k]*p>=a[j],那么对于一个比较大的i来说,想获得更大的差值,j是不用比上一个比较小的i得到的j小了。这里的限制关系是双指针降低复杂度的原理。

2. 起初困惑为什么外层的while条件已经有了j<n,内层的while还是出现这个条件,是因为在进行内层的循环时,顾不上外层的这个条件,所以内层对j进行增加操作时需要再写一遍。

AC代码

#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 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 i=0,j=0;
	int count = 0;
	while(i<n&&j<n){
		while(j<n&&(LL)A[i]*p>=A[j]){
			count = max(count,j-i+1);
			j++;
		}
		i++;
	}
	
	printf("%d",count);

	
	return 0;
}

以上是关于1030 完美数列(two pointers解法)的主要内容,如果未能解决你的问题,请参考以下文章

1030 完美数列 (25分)

PAT 1030. 完美数列

1030 完美数列

PTA乙级 (*1030 完美数列 (25分))

1030 完美数列 (25 分)

1030. 完美数列(25)