fbpx

Problema #2802 – Clasa – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se citește de la tastatură numărul n și un număr p cu valoarea 1 sau 2 și apoi n șiruri de tip nume prenume media1 media2 media3 separate prin spații.

Pentru p=1, se va afișa numărul elevilor care au media generală mai mare sau egală decât media clasei.

Pentru p=2, se va afișa pe primul rând media clasei și pe următoarele n rânduri, numele, prenumele și media generală a fiecărui elev, separate printr-un singur spațiu, sortat descrescător după medie; la medii egale se sortează crescător după nume, iar la nume egale crescător după prenume.

Date de intrare

Programul citește de la tastatură numerele n p, iar apoi de pe câte o linie cele n structuri de forma specificată în enunț.

Date de ieșire

Dacă p=1 programul va afișa pe ecran numărul elevilor care au media generală mai mare decât media clasei.

Dacă p=2 programul va afișa pe primul rând media clasei și pe următoarele n rânduri, numele, prenumele și media generală ale elevilor, separate printr-un singur spațiu, sortate conform cerinței.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • numele și prenumele au cel mult 100 de caractere
  • toate mediile clasei se vor afișa cu două zecimale, rezultatul afișat este considerat valid dacă diferența în valoare absolută dintre acesta și cel corect este cel mult 0.01.
  • media generală a unui elev este media aritmetică celor trei medii date.
  • media clasei este media aritmetică a mediilor generale ale elevilor.

Exemplul 1:

Intrare

5 1
Juro Muro 2 3 5
San Hill 7 5 9
Barbarigo San 9 2 4
Ezio Marbo 2 6 3
Gorbo Borbo 2 4 6

Ieșire

2

Exemplul 2:

Intrare

5 2
Juro Muro 2 3 5
San Hill 7 5 9
Barbarigo San 9 2 4
Ezio Marbo 2 6 3
Gorbo Borbo 2 4 6

Ieșire

4.60
San Hill 7.00
Barbarigo San 5.00
Gorbo Borbo 4.00
Ezio Marbo 3.67
Juro Muro 3.33
#include <bits/stdc++.h>



using namespace std;

char nume1[101][101] , prenume1[101][101];
double x , y , z;
int n , cer , cnt;
double s;

struct poz
{
    char nume[101] , prenume[101];
    double media;
}A[101];

int maimic(poz a , poz b)
{
    if(a.media > b. media) return 1;
    else if(a.media == b.media && strcmp(a.nume , b.nume) < 0) return 1;
    else if(a.media == b.media && strcmp(a.nume , b.nume) == 0 && strcmp(a.prenume , b.prenume) < 0) return 1;
    else return 0;
}

int main()
{
    cin >> n >> cer;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> nume1[i] >> prenume1[i] >> x >> y >> z;
        A[i].media = (x + y + z) /3;
        strcpy(A[i].nume , nume1[i]);
        strcpy(A[i].prenume , prenume1[i]);
        s += A[i].media;
    }
    double medgen = s / n;
    //cout << medgen << '\n';
    for(int i = 1 ; i <= n ; i++)
        if(A[i].media > medgen) cnt++;
    if(cer == 1) cout << cnt;
    else if(cer == 2)
    {
        cout << fixed << setprecision(2) << floor(medgen * 100) / 100 << '\n';
        sort(A+1 , A+n+1 , maimic);
        for(int i = 1 ; i <= n ; i++)
        {
            cout << A[i].nume << " " << A[i].prenume << " " << fixed << setprecision(2) << floor(A[i].media * 100) / 100 << '\n';
        }
    }
}
Comentarii

S-ar putea sa iti placa