0971 - Max: Difference between revisions
Paul Matei (talk | contribs) Pagină nouă: == Cerinţa == În zorii zilei, harnicele albinuţe se pregătesc să zboare la cules de nectar. În apropierea stupului, se află o grădină fermecată cu '''N''' flori, numerotate '''1, 2,… N'''. Pentru fiecare floare se cunoaște numărul de petale. Anumite flori din grădină pot fi flori capcană. O astfel de floare are un număr prim de petale. Dacă o albină s-ar aşeza pe corola florii capcană, atunci floarea i-ar fura o cantitate de nectar egală cu numărul ei... |
Paul Matei (talk | contribs) No edit summary |
||
(2 intermediate revisions by one other user not shown) | |||
Line 17: | Line 17: | ||
*'''1 ≤ n ≤ 100 000''' | *'''1 ≤ n ≤ 100 000''' | ||
*fiecare floare are cel mult '''10 000''' petale | *fiecare floare are cel mult '''10 000''' petale | ||
* | *nectarul unei flori poate fi cules de o singură albină | ||
* | *cantitatea maximă '''C''' de nectar culeasă este un număr natural, '''C ≤ 2 000 000 000''' | ||
== Exemplu == | == Exemplu == | ||
; Intrare | ; Intrare | ||
:8 | :8 | ||
25 13 10 7 1 12 31 102 | :25 13 10 7 1 12 31 102 | ||
; Ieșire | ; Ieșire | ||
:202 | :202 | ||
== Explicație == | == Explicație == | ||
Cantitatea maximă de nectar se obţine din florile '''1, 3, 5, 6 şi 8'''. '''C=3x25+10+3x1+12+102=202''' | Cantitatea maximă de nectar se obţine din florile '''1, 3, 5, 6 şi 8'''. '''C=3x25+10+3x1+12+102=202''' | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def is_prime(n): | def is_prime(n): | ||
if n < 2: | if n < 2: | ||
Line 56: | Line 56: | ||
return flower | return flower | ||
def | def validare_date(n, flowers): | ||
if not (1 <= n <= 100000): | if not (1 <= n <= 100000): | ||
return False | return False | ||
Line 67: | Line 67: | ||
flowers = [int(x) for x in input().split()] | flowers = [int(x) for x in input().split()] | ||
if | if validare_date(n, flowers): | ||
C = sum(get_nectar(f) for f in flowers) | |||
print( | print(C) | ||
else: | else: | ||
print("Datele de intrare nu corespund restricțiilor impuse.") | print("Datele de intrare nu corespund restricțiilor impuse.") | ||
Line 81: | Line 82: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Explicație rezolvare== | ==Explicație rezolvare== | ||
Acest | Acest program calculează suma unor numere, în funcție de proprietățile numerelor respective. | ||
Mai întâi, sunt definite trei funcții: | |||
*'''is_prime(n)''': returnează '''True''' dacă numărul '''n''' este prim și '''False''' în caz contrar. | |||
*'''num_divisors(n)''': returnează numărul de divizori ai numărului '''n'''. | |||
*'''get_nectar(flower)''': returnează un număr în funcție de proprietățile florii. Dacă floarea are un număr prim de petale, se returnează negativul numărului de petale. Dacă floarea are un număr impar de divizori, se returnează triplul numărului de petale. În celelalte cazuri, se returnează numărul de petale. | |||
Apoi, este definită funcția '''validare_date(n, flowers)''', care primește ca parametri numărul '''n''' de flori și '''lista flowers''' cu numărul de petale al fiecărei flori. Această funcție verifică dacă valorile introduse respectă restricțiile impuse în enunțul problemei. | |||
În funcția principală '''(__main__)''', se citesc valorile de intrare și se verifică dacă acestea sunt valide folosind funcția '''validare_date()'''. Dacă datele sunt valide, se calculează suma numerelor obținute prin aplicarea funcției '''get_nectar()''' pe fiecare element din '''lista flowers''', și se afișează valoarea calculată. În caz contrar, se afișează un mesaj de eroare. |
Latest revision as of 11:44, 11 April 2023
Cerinţa[edit | edit source]
În zorii zilei, harnicele albinuţe se pregătesc să zboare la cules de nectar. În apropierea stupului, se află o grădină fermecată cu N flori, numerotate 1, 2,… N. Pentru fiecare floare se cunoaște numărul de petale.
Anumite flori din grădină pot fi flori capcană. O astfel de floare are un număr prim de petale. Dacă o albină s-ar aşeza pe corola florii capcană, atunci floarea i-ar fura o cantitate de nectar egală cu numărul ei de petale.
Alte flori pot fi florile abundenţei. Numărul de petale ale florii abundenţei are un număr impar de divizori. Dacă o albină s-ar aşeza pe corola unei astfel de flori, atunci ea i-ar dărui albinuţei o cantitate de nectar egală cu triplul numărului ei de petale.
Celelalte flori pot fi flori obişnuite. Dacă o albină s-ar aşeza pe corola unei flori obişnuite, atunci floarea i-ar dărui albinuţei o cantitate de nectar egală cu numărul ei de petale.
Regina stupului, le-a poruncit albinuţelor să adune cea mai mare cantitate de nectar care se poate culege din grădină, altfel … vor fi alungate din stup.Scrieţi un program care să citească numerele naturale N și numărul de petale ale fiecărei flori şi care să determine cantitatea maximă C de nectar pe care albinuţele o pot aduna din grădina fermecată.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând numărul de petale ale fiecărei flori.
Date de ieşire[edit | edit source]
Programul va afișa pe ecran numărul C.
Restricții și precizări[edit | edit source]
- 1 ≤ n ≤ 100 000
- fiecare floare are cel mult 10 000 petale
- nectarul unei flori poate fi cules de o singură albină
- cantitatea maximă C de nectar culeasă este un număr natural, C ≤ 2 000 000 000
Exemplu[edit | edit source]
- Intrare
- 8
- 25 13 10 7 1 12 31 102
- Ieșire
- 202
Explicație[edit | edit source]
Cantitatea maximă de nectar se obţine din florile 1, 3, 5, 6 şi 8. C=3x25+10+3x1+12+102=202
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def is_prime(n):
if n < 2: return False for i in range(2, int(math.sqrt(n))+1): if n % i == 0: return False return True
def num_divisors(n):
count = 0 for i in range(1, int(math.sqrt(n))+1): if n % i == 0: count += 2 if i * i == n: count -= 1 return count
def get_nectar(flower):
if is_prime(flower): return -flower elif num_divisors(flower) % 2 == 1: return 3 * flower else: return flower
def validare_date(n, flowers):
if not (1 <= n <= 100000): return False if any(not (1 <= f <= 10000) for f in flowers): return False return True
if __name__ == '__main__':
n = int(input()) flowers = [int(x) for x in input().split()] if validare_date(n, flowers): C = sum(get_nectar(f) for f in flowers) print(C) else: print("Datele de intrare nu corespund restricțiilor impuse.")
</syntaxhighlight>
Explicație rezolvare[edit | edit source]
Acest program calculează suma unor numere, în funcție de proprietățile numerelor respective.
Mai întâi, sunt definite trei funcții:
- is_prime(n): returnează True dacă numărul n este prim și False în caz contrar.
- num_divisors(n): returnează numărul de divizori ai numărului n.
- get_nectar(flower): returnează un număr în funcție de proprietățile florii. Dacă floarea are un număr prim de petale, se returnează negativul numărului de petale. Dacă floarea are un număr impar de divizori, se returnează triplul numărului de petale. În celelalte cazuri, se returnează numărul de petale.
Apoi, este definită funcția validare_date(n, flowers), care primește ca parametri numărul n de flori și lista flowers cu numărul de petale al fiecărei flori. Această funcție verifică dacă valorile introduse respectă restricțiile impuse în enunțul problemei.
În funcția principală (__main__), se citesc valorile de intrare și se verifică dacă acestea sunt valide folosind funcția validare_date(). Dacă datele sunt valide, se calculează suma numerelor obținute prin aplicarea funcției get_nectar() pe fiecare element din lista flowers, și se afișează valoarea calculată. În caz contrar, se afișează un mesaj de eroare.