Feira de Artesanato

Problem Link

Solution by TioPatinhas100 pts

Code / Notes

#include <bits/stdc++.h>
using namespace std;
int main() {
    typedef long long ll;
    int N, T;
    cin >> N >> T;
    vector<int> tipos (N);
    vector<int> precos (N);
    for (int i = 0; i < N; i++) cin >> tipos[i];
    for (int i = 0; i < N; i++) cin >> precos[i];
    vector<multiset<int>> portipo (T + 1);
    multiset<pair<int,int>> global;
    for (int i = 0; i < N; i++) {
        portipo[tipos[i]].insert(precos[i]);
        global.insert({precos[i], tipos[i]});
    }
    long long ans = 0;
    int C;
    cin >> C;
    while(C > 0) {
        int u;
        cin >> u;
        if(u == 0 and !global.empty()) {
            auto it = global.begin();
            int valorvenda = it->first;
            int tipovenda = it->second; // <--- aqui está como int
            ans += (ll)valorvenda; // <--- Virou long long
            global.erase(global.begin());
            portipo[tipovenda].erase(portipo[tipovenda].find(valorvenda));
        } else if(!portipo[u].empty()){
            int valorvenda = *portipo[u].begin();
            ans += (ll)valorvenda;
            global.erase(global.find({valorvenda, u}));
            portipo[u].erase(portipo[u].find(valorvenda));
        }
        C--;
    }
    cout << ans << endl;
}
// Anotações:
// Veja que é necessário saber o multiset, sua diferença do set é que ele não apaga elementos repetidos
// Após ler tudo em vector's diferentes para melhor organização, "separa-se" os decididos dos indecisos
// Logo é so ler os clientes e ver se são indecisos ou não, o que querem e apagar do estoque
// veja que tem dois estoques, o global e o por tipo, o global é para facilitar os indecisos e o por tipo
// é para os decididos, use também long long, basta observar as restrições.
// Para mudar uma varíavel de int para long long depois de defini-lá como no valorvenda do while
// Repare no operador iterador, ele serve como um gps dentro do multiset, em geral nos arrays
// Por exemplo, o .begin() e o .end() são iteradores
// O *it acessa o valor para o qual o "GPS" aponta
// it++ move o GPS para o próximo elemento
// it->first e it->second acessam os membros do objeto que o GPS aponta
// Para achar o primeiro número maior ou igual a n usa-se:
// auto it = s.lower_bound(n);
// Sem auto teriamos que escrever: vector<int>::iterator it = v.begin() em vez de auto it = v.begin()
// Use iteradores quando quiser precisão ou para navegar estruturas que não são arrays
// Lembre-se it é o endereço, *it é o valor

Last updated 1 month, 3 weeks ago


« Back to problem