3677 - Cifre Vecine

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Sursa: [1]


Cerinţa

Se dau două numere naturale n și k. Determinați cea mai mare valoare care se poate obține eliminând din numărul n exact k cifre aflate pe poziții alăturate(una după alta).

Date de intrare

Fișierul de intrare va conține pe prima linie numărul n și pe a doua linie numărul k.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi în fișierul de ieșire se va scrie pe prima linie valoarea cerută. În caz contrar, pe ecran se va afișa: "Datele nu au fost introduse corect."

Restricţii şi precizări

  • n este un număr cuprins între 10 și inclusiv.
  • 1 ≤ k < numărul de cifre ale lui n.
  • pentru 50 de puncte k este 1.

Exemple

Exemplul 1

cifrevecine.in
10002
3
Ecran
Datele sunt introduse corect.
cifrevecine.out
12

Exemplul 2

cifrevecine.in
1938
2
Ecran
Datele sunt introduse corect.
cifrevecine.out
38

Rezolvare

# 3677

def verificare_date_intrare(n: int, k: int) -> bool:
    if not(10 <= n <= 10**17 and 1 <= k < len(str(n))):
        print("Datele nu au fost introduse corect.")
        return False
    print("Datele sunt introduse corect.")
    return True


def rezolva_problema(n: int, k: int) -> int:
    n_str = str(n)
    max_val = 0
    for i in range(len(n_str)-k):
        val = int(n_str[:i] + n_str[i+k:])
        if val > max_val:
            max_val = val
    return max_val


if __name__ == "__main__":
    with open("cifrevecine.in") as f:
        n = int(f.readline().strip())
        k = int(f.readline().strip())
    if not verificare_date_intrare(n, k):
        return
    with open("cifrevecine.out", "w") as f:
        f.write(str(rezolva_problema(n, k)))

Explicație rezolvare

Funcția verificare_date_intrare primește două argumente întregi, n și k, și returnează True dacă datele introduse sunt corecte și False altfel. Verificarea se face astfel: dacă n nu este cuprins între 10 și inclusiv sau k nu este cuprins între 1 și numărul de cifre ale lui n (calculat cu len(str(n))), atunci afișează un mesaj de eroare și returnează False. În caz contrar, afișează un mesaj de confirmare și returnează True.

Funcția rezolva_problema primește două argumente întregi, n și k, și returnează o valoare întreagă, cea mai mare valoare care se poate obține eliminând din numărul n exact k cifre aflate pe poziții alăturate (una după alta). Mai întâi, n este convertit într-un șir de caractere n_str. Apoi, se inițializează max_val cu 0 și se parcurg toate subșirurile de lungime len(n_str) - k ale lui n_str. Pentru fiecare subșir n_str[:i] + n_str[i+k:], se elimină cifrele aflate pe poziții alăturate și se obține un nou număr, val. Dacă val este mai mare decât max_val, se actualizează max_val cu val. La final, se returnează max_val.

În blocul principal if __name__ == "__main__":, se deschide fișierul de intrare "cifrevecine.in", se citesc valorile lui n și k, și se verifică dacă datele sunt corecte cu ajutorul funcției verificare_date_intrare. Dacă datele nu sunt corecte, programul se oprește. În caz contrar, se deschide fișierul de ieșire "cifrevecine.out" și se scrie valoarea returnată de funcția rezolva_problema în fișier.