Feirinha de Artesanato

Problem Link

Solution by TioPatinhas100 pts

Code / Notes

#include <bits/stdc++.h>
using namespace std;
int main() {
    int N;
    cin >> N;
    vector<int>Tipos(N);
    vector<int>Precos(N);
    multiset<int>EstoquePT [3];
    multiset<pair<int,int>>EstoqueGB;
    for (auto &x : Tipos) cin >> x;
    for (auto &x : Precos) cin >> x;
    for (int i = 0; i < N; i++) {
        EstoqueGB.insert({Precos[i], Tipos[i]});
        EstoquePT[Tipos[i]].insert(Precos[i]);
        }
    int C;
    cin >> C;
    int ans = 0;
    for (int i = 0; i < C; i++) {
        int ui;
        cin >> ui;
        if (ui == 0) {
            if(!EstoqueGB.empty()) { 
            auto it = EstoqueGB.begin();
            int valorvenda = it->first;
            int tipovenda = it->second;
            ans += valorvenda;

            EstoqueGB.erase(EstoqueGB.find({valorvenda, tipovenda}));
            EstoquePT[tipovenda].erase(EstoquePT[tipovenda].find(valorvenda));
            }    
        } else if (!EstoquePT[ui].empty()) {
            auto it = EstoquePT[ui].begin();
            int valorvenda = *it;
            ans += valorvenda;
            EstoquePT[ui].erase(EstoquePT[ui].find(valorvenda));
            EstoqueGB.erase(EstoqueGB.find({valorvenda, ui}));
        }
    }
    cout << ans;
 }
 // Anotações:
 // Errei o *it : Ele acessa o valor que está no endereço que o it aponta
 // Sempre usar multisets, invés de vector, pois é mais fácil de fazer o erase e etc
 // O último erro foi apenas no !EstoquePT[ui].empty() e no !EstoqueGB.empty()
 // Se não checar o empty() e tentar acessar um valor, o código trava

Last updated 1 month, 2 weeks ago


« Back to problem