Clasa a IX-a · Sortare și căutareRead in English

Prima poziție cu valoare mai mare sau egală cu x în C++

În engleză: First position with a value greater than or equal to x

O(log n)C++1757 de linii2 exemple

Ideea

Varianta de căutare binară care nu se oprește la prima potrivire: într-un vector sortat crescător, căutăm cea mai mică poziție p cu v[p] >= x. Dacă v[mij] >= x, mij este un candidat (îl reținem și căutăm mai la stânga); altfel răspunsul este în dreapta. Dacă toate valorile sunt mai mici decât x, răspunsul este n + 1.

Descrierea în engleză

The binary search variant that does not stop at the first match: in an array sorted in increasing order, we look for the smallest position p with v[p] >= x. If v[mij] >= x, mij is a candidate (we keep it and search further left); otherwise the answer is to the right. If all values are smaller than x, the answer is n + 1.

Complexitate
O(log n)
Clasa
Clasa a IX-a (Grade 9)

Exemple

Exemplul 1

Intrare

6
1 3 3 5 8 13
4

Ieșire așteptată

4
Exemplul 2

Intrare

6
1 3 3 5 8 13
3

Ieșire așteptată

2

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

prima-pozitie-mai-mare-sau-egala.cpp
/*
 * Titlu: Prima poziție cu valoare mai mare sau egală cu x
 * Clasa: 9
 * Capitol: Sortare și căutare
 * Descriere: Varianta de căutare binară care nu se oprește la prima potrivire:
 *            într-un vector sortat crescător, căutăm cea mai mică poziție p cu
 *            v[p] >= x. Dacă v[mij] >= x, mij este un candidat (îl reținem și
 *            căutăm mai la stânga); altfel răspunsul este în dreapta. Dacă toate
 *            valorile sunt mai mici decât x, răspunsul este n + 1.
 * Complexitate: O(log n)
 *
 * Exemplu
 * Intrare:
 * 6
 * 1 3 3 5 8 13
 * 4
 * Ieșire: 4
 *
 * Exemplu
 * Intrare:
 * 6
 * 1 3 3 5 8 13
 * 3
 * Ieșire: 2
 */
#include <iostream>
using namespace std;

int v[100001];

int main()
{
    int n, x;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    cin >> x;
    int st = 1, dr = n, rez = n + 1;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if (v[mij] >= x)
        {
            rez = mij;
            dr = mij - 1;
        }
        else
        {
            st = mij + 1;
        }
    }
    cout << rez << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.