Feira de Artesanato
Problem LinkSolution by TioPatinhas — 100 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