Un șir format din 2•n
numere naturale se numește paritar dacă fiecare dintre primii săi n
termeni fie are aceeași paritate cu oricare dintre ultimii săi n
termeni, fie este strict mai mic decât oricare număr de paritate diferită aflat printre aceștia.
Cerința
Dându-se un șir de 2•n
numere naturale, să se afișeze mesajul DA
, în cazul în care șirul aflat în fișier este paritar, sau mesajul NU
, în caz contrar. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.
Date de intrare
Fișierul de intrare paritar.in
conține pe prima linie numărul n
, iar pe a doua linie 2•n
numere naturale separate prin spații reprezentând elementele șirului.
Date de ieșire
Fișierul de ieșire paritar.out
va conține pe prima linie mesajul DA
, dacă șirul este paritar, sau mesajul NU
dacă șirul nu este paritar.
Restricții și precizări
1 ≤ n ≤ 250.000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât
1.000.000
Exemplul 1:
paritar.in
5 20 3 11 4 15 25 49 18 53 16
paritar.out
DA
Exemplul 2:
paritar.in
3 8 16 4 10 10 6
paritar.out
DA
Exemplul 3:
paritar.in
3 8 6 4 10 7 6
paritar.out
NU
Exemplul 4:
paritar.in
3 20 30 5 8 18 6
paritar.out
DA
Explicație
În primele n
numere sunt două numere pare, iar în ultimele n
numere nu există numere impare. Vom presupune deci că 20
și 30
sunt mai mici decât orice număr impar.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema paritar:
#include <fstream>
using namespace std;
/**
Afisam DA in cazurile:
- toate numerele din sir sunt pare
- toate numerele din sir sunt impare
- daca sunt in sir si numere pare si impare, atunci
- maximul par din primele n valori < maximul impar din ultimele n
si
- maximul impar din primele n valori < maximul par din ultimele n
Afisam NU in caz contrar
*/
int main()
{
int n, x, i, M1, m1, M0, m0;
ifstream fin("paritar.in");
ofstream fout("paritar.out");
fin >> n;
/// aflam valoarea maxima para si maxima impara din
/// primele n numere ale sirului
M1 = M0 = -1;
for (i = 1; i <= n; i++)
{
fin >> x;
if (x % 2 == 1 && x > M1) M1 = x;
if (x % 2 == 0 && x > M0) M0 = x;
}
/// aflam valoarea minima para si minima impara din
/// primele n numere ale sirului
m1 = m0 = 1000001;
for (i = 1; i <= n; i++)
{
fin >> x;
if (x % 2 == 1 && x < m1) m1 = x;
if (x % 2 == 0 && x < m0) m0 = x;
}
/// in sir sunt doar numere impare
if (m0 == 1000001 && M0 == -1)
{
fout << "DA\n";
return 0;
}
/// in sir sunt doar numere pare
if (m1 == 1000001 && M1 == -1)
{
fout << "DA\n";
return 0;
}
/// in sir sunt si numere pare, si impare
if (M1 < m0 && M0 < m1)
{
fout << "DA\n";
return 0;
}
fout << "NU\n";
fin.close();
fout.close();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2996 paritar
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2996 paritar de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!