알고리즘/SW Expert Academy
[D3] 9280. 진용이네 주차타워
혬혬
2020. 3. 9. 20:49
728x90
차고 같은 경우, 무조건 작은 인덱스 차고부터 써야되니 자료형 vector를 이용해 역순으로 정렬해줘서 사용했다.
대기자 같은 경우, 큐 자료 구조를 이용하여 FIFO을 구현하였다.
#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int car_box[101][2] = { 0 };
int car[2001][2] = { 0 };
queue<int> stack;
int price = 0;
int n;
int m;
vector<int> list;
int fill(int index) {
if (!list.empty()) {
car[index][1] = list.back();
car_box[list.back()][1] = index;
price += car_box[list.back()][0] * car[index][0];
list.pop_back();
return 1;
}
else {
if(stack.empty()||stack.front()!=index)
stack.push(index);
}
return 0;
}
int main(void) {
freopen("inp.inp", "r", stdin);
freopen("out.out", "w", stdout);
int tc = 0;
cin >> tc;
for (int p = 0; p < tc; p++) {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> car_box[i][0];
car_box[i][1] = 0;
list.push_back(i);
}
for (int i = 1; i <= m; i++) {
cin >> car[i][0];
car[i][1] = 0;
}
sort(list.begin(), list.end(), greater<int>());
for (int i = 1; i <= 2*m; i++) {
int index = 0;
cin >> index;
if (index>=0) {
fill(index);
}
else {
index = -index;
car_box[car[index][1]][1] = 0;
list.push_back(car[index][1]);
sort(list.begin(), list.end(), greater<int>());
car[index][1] = 0;
while (!stack.empty()) {
if (fill(stack.front())) {
stack.pop();
}
else {
break;
}
}
}
}
cout << "#"<<p+1<<" "<<price<<endl;
price = 0;
for (int i = 1; i <= n; i++) {
list.pop_back();
}
}
return 0;
}
728x90