fbpx

Problema #971 – Max – Rezolvari PBInfo

de Mihai-Alexandru

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

Cerinţă

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

#include <bits/stdc++.h>

using namespace std;

int prim(int n)
{
    int d=2;
    int cnt=1;
    while(n>1)
    {
        int p = 0;
        while(n%d==0)
        {
            n/=d;
            p++;
        }
        cnt*=(p+1);
        d++;
        if(d*d>n)
        d=n;
    }
    if(cnt==2)
    return 1;
    else
    return 0;
}

int main()
{
    int n;
    cin >> n;
    int x;
    int s=0;
    for(int i = 0 ; i < n ; ++i)
    {
        cin >> x;
        int m=sqrt(x);
        if(m*m==x)
        s+=3*x;
        else if(prim(x))
        s+=0;
        else
        s+=x;
    }
    cout << s;
}
Comentarii

S-ar putea sa iti placa