Informatică, întrebare adresată de teodortoderitap37w4j, 8 ani în urmă

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

Răspuns de andrei750238
4

► 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.
Anexe:

teodortoderitap37w4j: doar ca foarte putini ma pot ajuta. Is destul de grele
Patrick100: Buna, oare cum ar arata codul doar cu blibliotecile #include

#include

#include
Patrick100: Cum sa scriu codul doar cu bibliotecile iostream si string fara unordered_map?
andrei750238: In loc de unordered_map poti folosi un vector de dimensiune n daca indicii muncitorilor sunt mai mici decat n.
Patrick100: Eu nu sunt asa avansat si nu cunosc termeni care s-au folosit in rezolvare, daca m-ai putea ajuta cu o rezolvare doar cu for, char, int sau long long,de exemplu linia asta nu stiu ce face std::unordered_map tabel_ore; sau std::string txt_aux; sau std::pair* pointer_muncitor_minim = nullptr;sau std::cout << pointer_muncitor_minim->first;
Patrick100: adica eu nu stiu cum sa folosesc std:: si nu stiu cum sa-l inlocuiesc cu char, int.... Daca te rog sa ma ajuti sa rezolv problema si sa inteleg fiecare linie ce face m-ai ajuta foarte mult. Multumesc.
Patrick100: Asta am implementat si m-am blocat
Patrick100: #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;
}
andrei750238: #include
#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;
}
Patrick100: Va multumesc mult!
Alte întrebări interesante