0971 - Max

From Bitnami MediaWiki

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 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

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

Programul va afișa pe ecran numărul C.

Restricții și precizări

  • 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

Intrare
8
25 13 10 7 1 12 31 102
Ieșire
202

Explicație

Cantitatea maximă de nectar se obţine din florile 1, 3, 5, 6 şi 8. C=3x25+10+3x1+12+102=202

Rezolvare

<syntaxhighlight lang="python" line> import math

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 validate_input(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 validate_input(n, flowers):
       total_nectar = sum(get_nectar(f) for f in flowers)
       print(total_nectar)
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")




</syntaxhighlight>

Explicație rezolvare

Acest cod are ca scop calcularea cantității maxime de nectar care poate fi adunată dintr-o grădină cu flori, fiecare floare având o cantitate de nectar specifică. Anumite flori sunt considerate capcane și fură o cantitate de nectar dacă o albină se așează pe ele, în timp ce alte flori sunt considerate abundente și oferă o cantitate mai mare de nectar decât flori obișnuite. Se utilizează funcțiile is_prime, num_divisors și get_nectar pentru a determina tipul de floare și cantitatea de nectar corespunzătoare. De asemenea, se utilizează o funcție de validare a datelor de intrare pentru a verifica dacă acestea corespund restricțiilor impuse.