0558 - Cartonase 2

From Bitnami MediaWiki

Cerința

Supărat că Gigel a reușit, cu ajutorul vostru ( vezi problema Cartonașe ), să refacă progresia aritmetică scrisă pe cele n cartonașe, maleficul Costel este hotărât să intervină din nou.

Astfel, observă că Gigel a notat din nou pe n cartonașe cei n termeni consecutivi ai unei progresii aritmetice. Profitând de lipsa acestuia, Costel a ascuns un număr oarecare de cartonașe și le-a amestecat pe celelalte.

La întoarcere, Gigel constată lipsa a m cartonașe și vă roagă să-l ajutați să afle care sunt valorile scrise pe cartonașele care lipsesc.

Date de intrare

Programul citește de la tastatură numerele n m, cu semnificația de mai sus, apoi n-m numere naturale, reprezentând valorile scrise pe cartonașele care nu au fost ascunse.

Date de ieșire

Programul va afișa pe ecran m numere ordonate crescător, separate prin exact un spaţiu, reprezentând valorile scrise pe cartonașele ascunse.

Restricții și precizări

  • 4 ⩽ n ⩽ 1.000
  • 1 ⩽ m ⩽ n-2
  • valorile scrise de Gigel pe cele n cartonașe 1.000.000.000
  • Costel nu va lua niciodată primul sau ultimul cartonaș

Exemplul 1

Intrare
6 2
13 19 7 4
Ieșire
Datele de intrare corespund restricțiilor impuse
10 16

Explicație

Cele șase numere scrise de Gigel erau 4 7 10 13 16 19. Dintre acestea, lipsesc două, și anume 10 și 16.

Exemplul 2

Intrare
3 2
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

<syntaxhighlight lang="python" line>

  1. 0558 - Cartonase2

def validare_date(n, m):

   if not (4 <= n <= 1000):
       return False
   if not (1 <= m <= n - 2):
       return False
   return True


def rezolva_problema(n, m, cartonase_scrise):

   cartonase_scrise.sort()
   diferenta = (cartonase_scrise[-1] - cartonase_scrise[0]) // (n - 1)
   cartonase_lipsa = []
   for i in range(cartonase_scrise[0], cartonase_scrise[-1], diferenta):
       if i not in cartonase_scrise:
           cartonase_lipsa.append(i)
   return cartonase_lipsa[:m]


n, m = map(int, input("Introduceti n si m: ").split()) if validare_date(n, m):

   cartonase_scrise = list(map(int, input(f"Introduceti {n-m} numere scrise pe cartonase: ").split()))
   print("Datele de intrare corespund restricțiilor impuse")
   rezultat = rezolva_problema(n, m, cartonase_scrise)
   print(*rezultat)

else:

   print("Datele de intrare NU corespund restricțiilor impuse")
   exit(0)

</syntaxhighlight>