0742 - Numar 2

From Bitnami MediaWiki

Cerința[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemplul 1[edit | edit source]

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

Explicație[edit | edit source]

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[edit | edit source]

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

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 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()

</syntaxhighlight>