PAT A1085 Perfect Sequence (25 puntos) - implementación de búsqueda binaria

Dada una secuencia de enteros positivos y otro entero positivo p. Se dice que la secuencia es una secuencia perfecta si M≤m×p donde M y m son los números máximo y mínimo en la secuencia, respectivamente.
Ahora, dada una secuencia y un parámetro p, se supone que debes encontrar de la secuencia tantos números como sea posible para formar una subsecuencia perfecta.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene dos enteros positivos N y p, donde N (≤10 5 ) es el número de enteros en la secuencia y p (≤10 ​9 ) es el parámetro. En la segunda línea hay N números enteros positivos, cada uno no es mayor que 10 9 .

Especificación de salida:

Para cada caso de prueba, imprima en una línea el número máximo de enteros que se pueden elegir para formar una subsecuencia perfecta.

Entrada de muestra:

10 8
2 3 20 4 5 1 6 7 8 9

Salida de muestra:

8

Significado del título:

Dado un conjunto de enteros, entre las secuencias perfectas que estos enteros pueden formar, encuentre la secuencia perfecta que contenga la mayor cantidad de enteros y genere el número de estos enteros (la secuencia perfecta significa que el entero más grande M y el entero más pequeño m en la sucesión satisface M< =m*p, donde p es el parámetro dado.)

Ideas:

(1) Coloque un conjunto dado de enteros en el arreglo a[n], ordene el arreglo a para formar una secuencia ordenada no decreciente; (2)
coloque los elementos en el arreglo a[i] (0<=i<n ) Como el valor mínimo m en la secuencia perfecta, encuentre la posición j del primer elemento mayor que m*p en a[i+1]~a[n-1], ji es la longitud máxima de la secuencia perfecta.

código:

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 100010;
int n,p,a[maxn];

//在[i+1,n-1]范围内查找第一个大于x的数的位置
int binarySearch(int i,long long x){
    
    
	if(a[n-1]<=x) return n;
	int l=i+1,r=n-1,mid;
	while(l<r){
    
    
		mid = (l+r)/2;
		if(a[mid]<=x)
			l = mid+1;
		else
			r = mid; 
	}
	return l;
}

int main(){
    
    
	scanf("%d%d",&n,&p);
	for(int i=0;i<n;i++){
    
    
		scanf("%d",&a[i]);
	}
	sort(a,a+n);
	int ans = 1;
	for(int i=0;i<n;i++){
    
    
		int j = binarySearch(i,(long long)a[i]*p);
		ans = max(ans,j-i);
	}
	printf("%d",ans);
	return 0;
} 

vocabulario:

parámetro determinante, parámetro

Supongo que te gusta

Origin blog.csdn.net/PanYiAn9/article/details/104570092
Recomendado
Clasificación