3660 - Unghi Drept

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dau n puncte în plan. O operație constă în alegerea unui triunghi dreptunghic și adăugarea unui punct, astfel încât cele 3 puncte alese și cel adăugat să formeze un nou dreptunghi. Aflați numărul maxim de operații ce se pot efectua.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n linii cu câte 2 numere naturale.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul cerut. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu respecta cerintele impuse." , iar daca se indeplinesc, se afiseaza mesajul "Datele de intrare respecta cerintele impuse."

Restricţii şi precizări[edit | edit source]

  • 1 ≤ n ≤ 200.000
  • celelalte numere citite vor fi mai mici decât 2.000.000.000

Exemplul 1[edit | edit source]

Intrare
4
1 3
2 3
1 2
3 3
Ieșire
Datele de intrare respecta cerintele impuse.
2

Explicație[edit | edit source]

La prima operație, alegem triungiul cu coordonatele (1, 2), (1, 3), (2, 3) și adăugăm punctul (2, 2) . La al doilea, alegem triunghiul cu coordonatele (2, 2), (2, 3), (3, 3) și adăugăm punctul (3, 2) . De aici, nu mai putem efectua nicio operație.

Exemplul 2[edit | edit source]

Intrare
0
Ieșire
Datele de intrare nu respecta cerintele impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def numar_maxim_operatii(puncte):

   coordonate_x = {}
   coordonate_y = {}
   for x, y in puncte:
       if x in coordonate_x:
           coordonate_x[x] += 1
       else:
           coordonate_x[x] = 1
       if y in coordonate_y:
           coordonate_y[y] += 1
       else:
           coordonate_y[y] = 1
   numar_operatii = 0
   for x, y in puncte:
       numar_operatii += (coordonate_x[x] - 1) * (coordonate_y[y] - 1)
   return numar_operatii


if __name__ == "__main__":

   try:
       n = int(input())
       if 1 <= n <= 200000:
           puncte = [tuple(map(int, input().split())) for _ in range(n)]
           if all(1 <= x <= 2000000000 and 1 <= y <= 2000000000 for x, y in puncte):
               rezultat = numar_maxim_operatii(puncte)
               print("Datele de intrare respecta cerintele impuse.")
               print(rezultat)
           else:
               print("Datele de intrare nu respecta cerintele impuse.")
       else:
           print("Datele de intrare nu respecta cerintele impuse.")
   except ValueError:
       print("Datele de intrare nu respecta cerintele impuse.")

</syntaxhighlight>