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