Olimpiada Judeteana de Informatica 2021. Rezolvare problema „Concurs” in C++, clasa a V-a

Mai jos veti gasi problema „Concurs” data la Olimpiada Judeteana de Informatica in anul 2021 la clasa a V-a, iar dupa textul problemei veti gasi si rezolvarea mea.

Problema Concurs:

In orasul X va avea loc o noua editie a concursului Y , la care participa 3 echipe avand numerele de concurs 1, 2 si 3. Echipele pot avea numar diferit de concurenti.

Ordinea ın care participantii intra ın concurs este una oarecare. Fiecare concurent are de sustinut 9 probe. La fiecare proba, un concurent obtine un punctaj exprimat printr-un numar natural, cuprins ıntre 0 si 10, inclusiv.

La scurt timp dupa ce un concurent a sustinut toate cele 9 probe, se afiseaza performanta concurentului sub forma a doua numere naturale, astfel:

  • primul numar poate fi 1, 2 sau 3 si reprezinta echipa din care face parte concurentul;
  • al doilea numar este obtinut prin concatenarea (alipirea) numerelor ce reprezinta punctajele nenule obtinute de concurent la cele 9 probe. Daca un concurent are punctaj 0 la toate probele atunci al doilea numar este 0.

Punctajul total al unui concurent se obtine adunand punctajele obtinute de acesta la cele 9 probe. Punctajul unei echipe se obtine adunand punctajele totale obtinute de membrii acesteia.

De exemplu, afisajul 2 14102172, semnifica faptul ca acest concurent face parte din echipa 2 si are punctajele nenule 1, 4, 10, 2, 1, 7 si 2, la 7 dintre cele 9 probe sustinute. La celelalte doua probe a avut punctajul 0. Punctajul sau total este 27, contributia sa la punctajul echipei 2 fiind
de 27 de puncte.

Este declarata campioana echipa cu punctajul cel mai mare. Daca mai multe echipe au obtinut cel mai mare punctaj, atunci toate aceste echipe sunt declarate campioane. Totusi, daca toate echipele au totalizat 0 puncte, atunci nicio echipa nu este declarata campioana.

Cerinte:

Cunoscand numarul N de concurenti, echipele din care fac parte precum si punctajele obtinute de fiecare dintre ei, sa se determine:

  1. punctajul maxim obtinut de un concurent si numarul de concurenti care au obtinut acest punctaj;
  2. numarul sau numerele de concurs ale echipelor declarate campioane, n ordine crescatoare, si punctajul obtinut de acestea. Daca toate echipele au punctajul final 0, se va afisa textul FARA CAMPION

Date de intrare:

Fisierul de intrare concurs.in contine pe prima linie un numar C (care poate fi 1 sau 2), indicand cerinta de rezolvat. Pe a doua linie se gaseste un numar natural N reprezentand numarul de concurenti, iar pe fiecare dintre urmatoarele N linii se gasesc cate doua numere naturale, separate printr-un spatiu, reprezentand echipa si punctajele fiecaruia dintre cei N concurenti, ın ordinea intrarii ın concurs.

Date de iesire: 

  1. Daca C = 1, fisierul de iesire concurs.out va contine pe o singura linie, doua numere naturale, separate printr-un spatiu, reprezentand punctajul maxim obtinut de un concurent si numarul de concurenti care au obtinut acest punctaj.
  2. Daca C = 2, fisierul de iesire va contine pe o singura linie textul FARA CAMPION daca toate echipele au la final punctajul 0. In caz contrar linia va contine doua, trei sau patru numere naturale separate prin cate un spatiu, reprezentand numarul sau numerele de concurs ale echipelor declarate campioane, ın ordine crescatoare, si apoi punctajul obt,inut de aceste.

Restrictii si precizari:

  1. Se garanteaza ca datele din fisier respecta formatul precizat.
  2. 1 <= N <= 100 000.
  3. Pentru teste ın valoare de 35 de puncte avem C = 1.
  4. Pentru teste ın valoare de 65 de puncte avem C = 2.

Exemplul 1:

concurs.in:
1 6
1
7
1 1111973
2 3101971
1 1999
2 1010101
3 1010101
3 0
3 1371910

concurs.out:
31 4

Explicatii:

In primul exemplu punctajele obtinute de concurenti sunt: 23, 31, 28, 31, 31, 0, 31 deci punctajul maxim este 31 si sunt 4 concurenti cu acest punctaj.


Exemplul 2:

concurs.in:
2
5
1 1111973
2 3101971
1 1999
3 1010101
3 1371910

concurs.out:
3 62

Explicatii:

In al doilea exemplu sunt 5 concurenti, primul concurent este din echipa 1 si are punctajul 23, cel de-al doilea concurent este din echipa 2 si are punctajul 31, cel de-al treilea este din echipa 1 si are punctajul 28, al patrulea este din echipa 3 si are 31 de puncte, iar al cincilea este din echipa 3 si are 31 de puncte. Punctajul total al echipei 1 este 51, punctajul total al echipei 2 este 31, punctajul total al echipei 3 este 62. Deci, va cˆastiga echipa 3 cu 62 de puncte.


Exemplul 3:

concurs.in:
2
3
2 1111973
3 31019
1 1010111

concurs.out:
1 2 3 23

Explicatii:

In al treilea exemplu sunt 3 concurenti, primul concurent este din echipa 2 si are punctajul 23, cel de-al doilea concurent este din echipa 3 si are punctajul 23, cel de-al treilea este din echipa 1 si are punctajul 23. Deci, toate cele 3 echipe au punctaj maxim 23.


Mai jos veti gasi metoda mea de rezolvare a problemei:

#include <fstream>

using namespace std;
ifstream fin("concurs.in");
ofstream fout("concurs.in");
long long maximumScore, nr, team, score, numberOfCompetitors, i, task, maximum, s, aux, scoreTeam1, scoreTeam2, scoreTeam3;
int main() {
   fin >> task;
   if (task == 1) {
      fin >> numberOfCompetitors;
      maximum = 0;
      for (i = 1; i <= numberOfCompetitors; i++) {
         fin >> team;
         fin >> score;
         aux = score;
         s = 0;
         while (aux > 0) {
            if (aux % 10 == 0) {
               s = s + 10;
               aux = aux / 100;
            } else {
               s = s + aux % 10;
               aux = aux / 10;
            }
         }
         if (s > maximum) {
            maximum = s;
            nr = 1;
         } else if (s == maximum) nr++;
      }
      fout << maximum << " " << nr << endl;
   } else {
      fin >> numberOfCompetitors;
      maximum = 0;
      scoreTeam1 = 0;
      scoreTeam2 = 0;
      scoreTeam3 = 0;
      for (i = 1; i <= numberOfCompetitors; i++) {
         fin >> team;
         fin >> score;
         if (score == 0) s = 0;
         else {
            aux = score;
            s = 0;
            while (aux > 0) {
               if (aux % 10 == 0) {
                  s = s + 10;
                  aux = aux / 100;
               } else {
                  s = s + aux % 10;
                  aux = aux / 10;
               }
            }
            if (team == 1) scoreTeam1 = scoreTeam1 + s;
            if (team == 2) scoreTeam2 = scoreTeam2 + s;
            if (team == 3) scoreTeam3 = scoreTeam3 + s;
         }
      }
      if (scoreTeam1 == 0 && scoreTeam2 == 0 && scoreTeam3 == 0)
         fout << "FARA CAMPION" << endl;
      else {
         maximum = -1;
         if (scoreTeam1 > maximum) maximum = scoreTeam1;
         if (scoreTeam2 > maximum) maximum = scoreTeam2;
         if (scoreTeam3 > maximum) maximum = scoreTeam3;
         if (scoreTeam1 == maximum) g << "1 " << maximum << endl;
         if (scoreTeam2 == maximum) g << "2 " << maximum << endl;
         if (scoreTeam3 == maximum) g << "3 " << maximum << endl;
      }
   }
   f.close();
   g.close();
   return 0;
}

Sper sa va fie de folos. 😉

Daca aveti intrebari, va rog sa lasati un mesaj mai jos in comentarii.

Ma numesc Sebastian, am 10 ani si sunt pasionat de: programare in Python, C++, Raspberry Pi, citit, astronomie, astrofizica, chimie, sport, fotografie si Xbox. Ma gasesti si pe: Instagram, Youtube, Facebook
Comments

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *