Una aplicación simple de búsqueda binaria

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.

Supongo que te gusta

Origin blog.csdn.net/qq_19272233/article/details/119429985
Recomendado
Clasificación