pregunta
1085 Secuencia Perfecta (25 分)
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 números enteros positivos N y p, donde N (≤10
5
) es el número de números 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
Sin línea en blanco al final
Salida de muestra:
8
tren de pensamiento
Recorra la matriz de menor a mayor, luego enumere cada elemento, multiplíquelo por p y use upper_bound para encontrar el primer elemento mayor que el producto. Actualizar el número máximo de elementos.
el código
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int seq[maxn];
int main(){
int n,p,temp,ans=1;
cin>>n>>p;
for (int i = 0; i < n; ++i) {
cin>>temp;
seq[i] = temp;
}
sort(seq,seq+n);
for (int j = 0; j < n; ++j) {
int x = upper_bound(seq+j+1,seq+n,(long long)seq[j]*p)-seq;
ans = max(ans,x-j);
}
cout<<ans;
return 0;
}
Resumir
Recordar el uso de la función upper_bound() y la función lower_bound() puede simplificar mucho el código.