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ăspunsuri la întrebare
► 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.
#include
#include
#include
using namespace std;
const int MAX_SIZE = 10000;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int nr_workers, nr_hours;
}
#include
using namespace std;
int main() {
int n;
int* v = new int[10000]{};
cin >> n;
int id_munc, nr_h;
int id_mx = 0;
char aux[20];
for (int i = 0; i < n; i++) {
//Citeste propozitia
cin >> aux >> id_munc >> aux >> aux >> nr_h >> aux;
//Aduna numarul de ore
v[id_munc] += nr_h;
//Verificare daca numarul total ore depaseste maxim curent, actualizare
if (v[id_munc] > v[id_mx]) id_mx = id_munc;
}
//Afisare rezultat
cout << id_mx;
delete[] v;
}