1781 - Intersectii

From Bitnami MediaWiki
Revision as of 17:20, 3 June 2024 by AjM (talk | contribs) (Pagină nouă: == Enunt == Dreptunghiul ABCD are laturile de lungimi w şi h, numere naturale pare. Acest dreptunghi este desenat pe o foaie de matematică şi este descompus în w ∙ h pătrate de latură 1. Vârfurile A, B, C şi D sunt plasate în colţurile unor pătrate de latură 1. Se alege un punct P din interiorul dreptunghiului ABCD, situat în colţul unui pătrat de latură 1 şi se uneşte prin segmente de dreaptă cu cele patru colţuri ale dreptunghiului. Unele segmente inte...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunt[edit | edit source]

Dreptunghiul ABCD are laturile de lungimi w şi h, numere naturale pare. Acest dreptunghi este desenat pe o foaie de matematică şi este descompus în w ∙ h pătrate de latură 1. Vârfurile A, B, C şi D sunt plasate în colţurile unor pătrate de latură 1. Se alege un punct P din interiorul dreptunghiului ABCD, situat în colţul unui pătrat de latură 1 şi se uneşte prin segmente de dreaptă cu cele patru colţuri ale dreptunghiului. Unele segmente intersectează pătrate de latură 1 în exact două puncte distincte, altele într-un singur punct. Numim pătrat 2-intersectat, un pătrat de latură 1 intersectat de un segment în exact 2 puncte distincte.

Cerinţa[edit | edit source]

Se dau două numere naturale w şi h reprezentând lungimile laturilor dreptunghiului ABCD, un număr natural n şi n numere naturale x1, x2,… xn cu propietatea din enunt. Punctul P se plasează, pe rând, în toate punctele interioare dreptunghiului ABCD care sunt colţuri ale unor pătrate de latură 1. Pentru fiecare valoare x[i] (1 ≤ i ≤ n), determinaţi numărul de segmente distincte care trec prin exact x[i] pătrate 2-intersectate.

Date de intrare[edit | edit source]

Fişierul de intrare intersectii.in conţine pe prima linie trei numere naturale w, h (reprezentând dimensiunile dreptunghiului) şi n. Următoarele n linii conţin câte un număr natural x[i] cu semnificaţia de mai sus.

Date de ieșire[edit | edit source]

Fişierul de ieşire intersectii.out va conţine n linii. Pe fiecare linie i va fi scris numărul de segmente care trec prin exact x[i] pătrate 2-intersectate, obţinute după plasarea punctului P în fiecare colţ al unui pătrat de latură 1 din interiorul dreptunghiului ABCD.

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

  • 2 ≤ w , h ≤ 2000 numere naturale pare;
  • 2 ≤ n ≤ 100000;
  • punctul P se alege doar în interiorul dreptunghiului;
  • pentru 40% din teste 2 ≤ w, n, h ≤ 500.

Exemplul 1[edit | edit source]

intersectii.in
4 6 2

3 5

intersectii.out
12

4

Explicație[edit | edit source]

Se pot obţine 12 segmente care trec prin exact 3 pătrate 2-intersectate şi 4 segmente care trec prin exact 3 pătrate 2-intersectate.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def count_intersected_squares(w, h):

   # Calculăm numărul de pătrate 2-intersectate pentru fiecare punct P
   return (w - 1) * (h - 1) * 2

def main():

   # Citim datele de intrare din fișier
   with open("intersectii.in", "r") as fin:
       w, h, n = map(int, fin.readline().split())
       x_values = [int(fin.readline()) for _ in range(n)]
   # Calculăm numărul de pătrate 2-intersectate pentru dreptunghi
   num_intersected_squares = count_intersected_squares(w, h)
   # Calculăm numărul de segmente care trec prin fiecare x[i] pătrate 2-intersectate
   results = [x * num_intersected_squares for x in x_values]
   # Scriem rezultatele în fișierul de ieșire
   with open("intersectii.out", "w") as fout:
       fout.write("\n".join(map(str, results)) + "\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>