3356 - Alfa

De la Universitas MediaWiki

Cerinţa

Se dă un șir format din n numere naturale. Se mai dă o valoare x și se garantează că șirul începe și se termină cu valoarea x. Transformați șirul astfel:

  • Elementele cu valoarea x rămân pe pozițiile lor;
  • Secvențele de elemente diferile de x aflate între două poziții cu valoarea x se ordonează crescător (între aceleași două elemente cu valoarea x se vor afla aceleași elemente ca la început dar în ordine crescătoare).

Date de intrare

Fișierul alfa.in conține pe prima linie un număr natural n reprezentând dimensiunea șirului și un număr x cu semnificația de mai sus. Pe linia a doua n numere naturale, separate prin câte un spațiu, reprezentând elementele șirului.

Date de ieşire

Fișierul alfa.out conține cele n elemente ale șirului în ordinea cerută.

Restricții și precizări

  • 2 <= n <= 1000
  • Elementele șirului dat sunt naturale nenule formate din maximum 4 cifre
  • Pentru 40 de puncte șirul conține doar două elemente cu valoarea x (primul și ultimul).

Exemplu

alfa.in
10 3
3 4 1 2 3 7 9 8 3 3
alfa.out
3 1 2 4 3 7 8 9 3 3

Rezolvare

def transforma_sir(n, x, sir):
    i = 0
    # Parcurgem șirul de numere
    while i < n:
        # Dacă numărul curent este egal cu x
        if sir[i] == x:
            # Căutăm următorul număr egal cu x
            j = i + 1
            while j < n and sir[j] != x:
                j += 1
            # Dacă am găsit un alt număr egal cu x
            if j < n:
                # Sortăm numerele dintre cele două numere egale cu x
                sir[i+1:j] = sorted(sir[i+1:j])
            # Ne mutăm la următorul număr egal cu x
            i = j
        else:
            # Dacă numărul curent nu este egal cu x, trecem la următorul număr
            i += 1
    # Întoarcem șirul transformat
    return sir

if __name__ == "__main__":
    n = 10
    x = 3
    sir = [3, 4, 1, 2, 3, 7, 9, 8, 3, 3]
    # Apelăm funcția cu valorile date și afișăm rezultatul
    print(transforma_sir(n, x, sir))