fbpx

Problema #2242 – inserari – Rezolvari PBInfo

de Mihai-Alexandru

Se consideră un șir a[1], a[2], …, a[n] de numere distincte din mulțimea {1,2,…,n}. O operație constă din extragerea unui număr din șir de la o anumită poziție și inserarea lui în altă poziție a șirului. De exemplu, dacă a = 1, 2, 5, 3, 6, 4, atunci 5 poate fi inserat după 3 și se obține a = 1, 2, 3, 5, 6, 4.

Cerința

Să se obțină șirul ordonat crescător efectuând un număr minim de operații de inserare.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.

Date de ieșire

Programul va afișa pe ecran un singur număr natural reprezentând numărul minim de operații de inserare necesar ordonării crescătoare a șirului.

Restricții și precizări

  • 1 ≤ n ≤ 100 000

Exemplu

Intrare

6
1 2 5 3 6 4

Ieșire

2

Explicație

O soluție de ordonare efectuând două operații este următoarea. Se ia 5 și se inserează după 3. Se obține 1, 2, 3, 5, 6, 4. Se ia apoi 4 și se inserează după 3. Se obține 1, 2, 3, 4, 5, 6.

#include <bits/stdc++.h>
using namespace std;

int n , x , l , A[100001] , p;

int cautare_binara(int x , int n)
{
    int st = 1 , dr = n;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(A[mij] > x) dr = mij - 1;
        else st = mij + 1;
    }
    return st;
}
int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> x;
        p = cautare_binara(x , l);
        if(A[p] <= x) l++ , p = l;
        A[p] = x;
    }
    cout << n - l;
}
Comentarii

S-ar putea sa iti placa