0742 - Numar 2

De la Universitas MediaWiki

Cerința

Fie un număr natural a având n cifre. Scrieţi un program care să determine un număr natural x cu proprietatea că este cel mai mic număr mai mare decât a, care are exact aceleaşi cifre ca şi numărul a.

Date de intrare

Fișierul de intrare numar2in.tx conține două linii:

  • pe prima linie un număr natural reprezentând valoarea lui n;
  • pe a doua linie, fără spaţii între ele, n cifre reprezentând numărul a.

Date de ieșire

Fișierul de ieșire numar2out.txt va conține o singură linie pe care se va afla numărul x.

Restricții și precizări

  • 1 ⩽ n ⩽ 5.000.000
  • pentru 50% din teste, n ⩽ 1.000.000
  • pentru toate datele de test există soluţie.

Exemplul 1

Intrare
numar2in.txt
6
204924
Ieșire
Datele de intrare corespund restricțiilor impuse
numar2out.txt
204942

Explicație

Există mai multe numere formate din exact aceleaşi cifre ca şi numărul 204924 mai mari decât el. Dintre acestea, 204942 este cel mai mic.

Exemplul 2

Intrare
numar2in.txt
6
2049241
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#0742 - Numar2

def valideaza_input(n, a):
    if not (1 <= n <= 5000000):
        return False

    if len(str(a)) != n:
        return False

    return True


def gaseste_permutare_urmatoare(a):
    a = list(str(a))
    n = len(a)

    # Găsim cea mai mică cifră care poate fi schimbată
    i = n - 2
    while i >= 0 and a[i] >= a[i + 1]:
        i -= 1

    # Dacă nu există o astfel de cifră, atunci a este cel mai mare și nu există soluție
    if i == -1:
        return None

    # Găsim cea mai mică cifră mai mare decât a[i] în partea dreaptă
    j = n - 1
    while a[j] <= a[i]:
        j -= 1

    # Schimbăm a[i] cu a[j]
    a[i], a[j] = a[j], a[i]

    # Inversăm cifrele de la i+1 la sfârșit
    a[i + 1:] = reversed(a[i + 1:])

    return int(''.join(a))


def main():
    with open("numar2in.txt", "r") as file:
        n = int(file.readline().strip())
        a = int(file.readline().strip())

    if valideaza_input(n, a):
        print("Datele de intrare corespund restricțiilor impuse")

        rezultat = gaseste_permutare_urmatoare(a)

        with open("numar2out.txt", "w") as file_out:
            file_out.write(str(rezultat))
    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        exit(0)


if __name__ == "__main__":
    main()