2448 - Pătrate3: Difference between revisions

From Bitnami MediaWiki
Dragos1234 (talk | contribs)
Dragos1234 (talk | contribs)
 
(18 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Sursa: [https://www.pbinfo.ro/probleme/2248/coordonate]
Sursa: [https://www.pbinfo.ro/probleme/2448/patrate3]
== Cerinţa ==
== Cerinţa ==
Pentru valorile n, x, y, val date, trebuie să determinați:
Scrieţi un program care rezolvă următoarele două cerinţe:


* ce valoare V se află în pătratul n x n la poziția (x, y).
1. Citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;
* la ce poziție (i, j) se află valoarea val în pătratul n x n.
 
2. Citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.


== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numerele '''n''', '''x''', '''y''', '''val''', separate prin spații.
Fișierul de intrare '''patrate3.in''' conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.


== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" și pe ecran numerele '''V''', '''i''', '''j''', separate prin câte un spațiu, unde '''V''' reprezintă valoarea de la poziția '''(x, y)''', iar '''(i, j)''' reprezintă poziția unde se află valoarea '''val'''. În caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor.".
Dacă C = 1, atunci fişierul de ieşire '''patrate3.out''' conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei si mesajul "Datele introduse corespund cerintelor". Dacă C = 2, atunci fişierul de ieşire '''patrate3.out''' conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2 și mesajul "Datele introduse corespund cerințelor." În caz contrar programul v-a afișa mesajul "Datele introduse nu corespund cenrintelor" și se va inceta executia programului.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 1 ⩽ '''n''' ⩽ 20000
* 1 ⩽ '''M''' ⩽ 260.000.000
* 1 ⩽ '''x, y''' ⩽ '''n'''
* 1 ⩽ '''N''' ⩽ 2.147.302.920
* 1 ⩽ '''val''' ⩽ n^2
* Numerele N, M, T și K sunt numere naturale


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Intrare
: 4
: ''patrate3.in''
: 2
: 1 3
: 3
: 12
; Ieșire
; Ieșire
: 7 3 4
: Datele introduse corespund cerințelor
: ''patrate3.out''
: 24
<br>
<br>


== Exemplul 2 ==
== Exemplul 2 ==
; Intrare
; Intrare
: 21367283
: ''patrate3.in''
: 287357253812
: 0 0
: 216932863921
: 89730960
; Ieșire
; Ieșire
: Datele introduse nu corespund cerintelor.
: Datele introduse nu corespund cerințelor
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#2248
#2448
def is_valid_input(n, x, y, v):
import math
     if not (1 <= n <= 20000):
 
         print("Datele introduse nu corespund cerintelor.")
 
        exit()
def validate_input(m, n):
     if not (1 <= x <= n) or not (1 <= y <= n):
     if not (1 <= m <= 260000000):
         print("Datele introduse nu corespund cerintelor.")
         return False
        exit()
     if not (1 <= n <= 2147302920):
     if not (1 <= v <= n ** 2):
        return False
         print("Datele introduse nu corespund cerintelor.")
    # Verifică că M și N sunt numere naturale
         exit()
    if not isinstance(m, int) or not isinstance(n, int):
         return False
    # Verifică că nu există două pătrate cu același număr de valori scrise pe laturi
    num_values = [m, n]
     for i in range(2):
         count = num_values.count(num_values[i])
         if count > 1:
            return False
     return True
     return True




def calculate_coordinates(n, x, y, v):
def read_input():
     # Verifică dacă intrările sunt valide
     with open("patrate3.in", "r") as f:
    if not is_valid_input(n, x, y, v):
        cer, n = map(int, f.readline().split())
        return None
    return cer, n


    # Calculează coordonatele folosind formulele din program
    coord_x = (x - 1) * n + y
    coord_y = v // n if v % n == 0 else v // n + 1
    coord_z = n if v % n == 0 else v % n


     return (coord_x, coord_y, coord_z)
def write_output(output):
     with open("patrate3.out", "w") as f:
        f.write(str(output))




def main():
def solve(cer, n):
     n = int(input())
     if cer == 1:
     x = int(input())
        return 8 * n
    y = int(input())
     else:
    v = int(input())
        m = int(math.sqrt(n))
        if m % 2 == 1:
            return (m + 1) // 2
        else:
            return m // 2


    # Calculează coordonatele folosind funcția definită anterior
    coords = calculate_coordinates(n, x, y, v)


     if coords is None:
if __name__ == '__main__':
         print("Input invalid")
    cer, n = read_input()
     if not validate_input(cer, n):
         print("Datele introduse nu corespund cerintelor.")
     else:
     else:
        # Afișează coordonatele separate printr-un spațiu
         print("Datele introduse corespund cerintelor.")
         print("Datele introduse corespund cerintelor.")
         print(coords[0], coords[1], coords[2])
         output = solve(cer, n)
 
        write_output(output)


main()
</syntaxhighlight>
</syntaxhighlight>


== Explicatie rezolvare ==
== Explicatie rezolvare ==
Acest program verifică dacă intrările sunt valide și calculează coordonatele unui punct într-un grid dreptunghiular. Funcția is_valid_input verifică dacă valorile introduse sunt valide, conform cerințelor problemei. Dacă acestea nu corespund, se afișează un mesaj de eroare și programul se încheie. Funcția calculate_coordinates primește intrările valide și calculează coordonatele punctului folosind formulele date în problemă. În funcția main, se citesc intrările și se apelează funcția calculate_coordinates pentru a calcula coordonatele. Dacă intrările nu sunt valide, se afișează un mesaj de eroare. În caz contrar, se afișează coordonatele punctului.
Acest program citește date de intrare dintr-un fișier numit '''patrate3.in''', validează datele de intrare conform unor criterii prestabilite, rezolvă problema specifică (calculând o valoare pentru variabila output) și afișează rezultatul final într-un fișier numit '''patrate3.out'''.
 
Funcția '''validate_input(m, n)''' verifică dacă m și n îndeplinesc anumite condiții și returnează True dacă sunt valide, sau False în caz contrar.
 
Funcția '''read_input()''' deschide fișierul '''patrate3.in''', citește primul număr (cer) și al doilea număr (n) din prima linie, apoi le returnează sub formă de tuplu.
 
Funcția '''write_output(output)''' deschide fișierul "patrate3.out" și scrie valoarea output în el.
 
Funcția '''solve(cer, n)''' primește cer și n și returnează o valoare specifică în funcție de valoarea lui cer și n.
 
În secțiunea main, programul citește datele de intrare, verifică dacă sunt valide prin apelul funcției '''validate_input''', apoi rezolvă problema și afișează rezultatul final dacă datele de intrare sunt valide.

Latest revision as of 18:24, 12 May 2023

Sursa: [1]

Cerinţa[edit | edit source]

Scrieţi un program care rezolvă următoarele două cerinţe:

1. Citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;

2. Citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.

Date de intrare[edit | edit source]

Fișierul de intrare patrate3.in conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.

Date de ieșire[edit | edit source]

Dacă C = 1, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei si mesajul "Datele introduse corespund cerintelor". Dacă C = 2, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2 și mesajul "Datele introduse corespund cerințelor." În caz contrar programul v-a afișa mesajul "Datele introduse nu corespund cenrintelor" și se va inceta executia programului.

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

  • 1 ⩽ M ⩽ 260.000.000
  • 1 ⩽ N ⩽ 2.147.302.920
  • Numerele N, M, T și K sunt numere naturale

Exemplul 1[edit | edit source]

Intrare
patrate3.in
1 3
Ieșire
Datele introduse corespund cerințelor
patrate3.out
24


Exemplul 2[edit | edit source]

Intrare
patrate3.in
0 0
Ieșire
Datele introduse nu corespund cerințelor


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2448

import math


def validate_input(m, n):

   if not (1 <= m <= 260000000):
       return False
   if not (1 <= n <= 2147302920):
       return False
   # Verifică că M și N sunt numere naturale
   if not isinstance(m, int) or not isinstance(n, int):
       return False
   # Verifică că nu există două pătrate cu același număr de valori scrise pe laturi
   num_values = [m, n]
   for i in range(2):
       count = num_values.count(num_values[i])
       if count > 1:
           return False
   return True


def read_input():

   with open("patrate3.in", "r") as f:
       cer, n = map(int, f.readline().split())
   return cer, n


def write_output(output):

   with open("patrate3.out", "w") as f:
       f.write(str(output))


def solve(cer, n):

   if cer == 1:
       return 8 * n
   else:
       m = int(math.sqrt(n))
       if m % 2 == 1:
           return (m + 1) // 2
       else:
           return m // 2


if __name__ == '__main__':

   cer, n = read_input()
   if not validate_input(cer, n):
       print("Datele introduse nu corespund cerintelor.")
   else:
       print("Datele introduse corespund cerintelor.")
       output = solve(cer, n)
       write_output(output)

</syntaxhighlight>

Explicatie rezolvare[edit | edit source]

Acest program citește date de intrare dintr-un fișier numit patrate3.in, validează datele de intrare conform unor criterii prestabilite, rezolvă problema specifică (calculând o valoare pentru variabila output) și afișează rezultatul final într-un fișier numit patrate3.out.

Funcția validate_input(m, n) verifică dacă m și n îndeplinesc anumite condiții și returnează True dacă sunt valide, sau False în caz contrar.

Funcția read_input() deschide fișierul patrate3.in, citește primul număr (cer) și al doilea număr (n) din prima linie, apoi le returnează sub formă de tuplu.

Funcția write_output(output) deschide fișierul "patrate3.out" și scrie valoarea output în el.

Funcția solve(cer, n) primește cer și n și returnează o valoare specifică în funcție de valoarea lui cer și n.

În secțiunea main, programul citește datele de intrare, verifică dacă sunt valide prin apelul funcției validate_input, apoi rezolvă problema și afișează rezultatul final dacă datele de intrare sunt valide.