👤

Pe prima linie se va găsi un singur număr natural n, iar pe următoarele n linii se vor găsi n propoziții de tipul Muncitorul x a muncit y ore, unde x și y sunt numere naturale.
Se va afișa un singur număr natural, reprezentând numărul de ordine a muncitorului care a depus cele mai multe ore de muncă. În cazul în care mai mulți muncitori au depus numărul maxim de ore, se va afișa cel cu indice de ordine cel mai mic.

Restricții și precizări:
În cazul în care unul dintre angajați apare de mai multe ori printre datele de intrare, orele de muncă se vor aduna.
1 ≤ n, x, y ≤ 10 000

Exemplu:

Date de intrare:
5
Muncitorul 1 a muncit 10 ore
Muncitorul 23 a muncit 5 ore
Muncitorul 3 a muncit 3 ore
Muncitorul 23 a muncit 11 ore
Muncitorul 1 a muncit 2 ore

Date de ieșire:
23


Răspuns :

► Program C++:

#include <iostream>

#include <string>

#include <unordered_map>

int main() {

std::unordered_map<unsigned, unsigned> tabel_ore;

unsigned n;

//Citire date, adaugare in tabel

std::cin >> n;

for (unsigned index = 1; index <= n; index++) {

 unsigned nr_muncitor;

 unsigned nr_ore;

 std::string txt_aux;

 std::cin >> txt_aux >> nr_muncitor >> txt_aux >> txt_aux >> nr_ore >> txt_aux;

 tabel_ore[nr_muncitor] += nr_ore;

}

//Determinare maxim

std::pair<const unsigned, unsigned>* pointer_muncitor_minim = nullptr;

for (auto& muncitor : tabel_ore) {

 if (!pointer_muncitor_minim || muncitor.second > pointer_muncitor_minim->second || muncitor.second == pointer_muncitor_minim->second && muncitor.first < pointer_muncitor_minim->first) {

  pointer_muncitor_minim = &muncitor;

 }

}

//Afisare rezultat

std::cout << pointer_muncitor_minim->first;

}

► Explicatie :

  • Folosim variabila txt_aux pentru a memora temporar textul care e inutil, dar care face parte din formatarea datelor de intrare (Muncitorul, a, muncit)
  • Un pair este un tip de date special care are ca si campuri alte doua tipuri de date. In cazul nostru, pair<const unsigned, unsigned> este o pereche care retine un numar natural constant si un numar natural. Pentru a avea acces la primul element accesam folosind membrul first, pentru a avea acces la al doilea element accesam folosind second
  • Un unordered_map este un container din STL care retine perechi de valori de tip (cheie, valoare), altfel spus fiecarei chei ii este asociata o valoare. In implementarea acestuia se foloseste pair. E asemanator cu un vector (si se comporta ca un vector in mare parte), cu diferenta ca ocupa mai putina memorie (daca foloseam un vector simplu trebuia sa folosim un vector de 10000 de elemente). In cazul nostru cheia reprezinta numarul muncitorului, valoarea reprezinta numarul de ore lucrate. Deci vom folosi unordered_map<unsigned, unsigned>. Primul element va fi transformat automat in constanta.
  • Un pointer este un tip de date care retine adresa altei locatii de memorie (in cazul nostru folosim pointer pentru a gasi adresa perechii (muncitor, numar_de_ore) pe care il cere problema)
  • Editat pentru citire de la tastatura.
Vezi imaginea ANDREI750238