2477 차량 정비소

2019. 8. 9. 12:28알고리즘/삼성

정렬을 포함한 시뮬레이션 문제.

1. 정비소 사람을 뺀다

2. 접수처 사람을 빼서 B 대기줄에 넣어준다

3. 입장시간이 되면 사람을 넣는다

4. 정렬 후 접수처에 넣는다

5. 정렬 후 정비소에 넣는다

 

고려해야할 정보들이 많기 때문에 구조체 선언으로 제어했다

 

문제: https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV6c6bgaIuoDFAXy

깃허브주소: https://github.com/surinoel/boj/blob/master/swea2477.cpp

 

#include <deque>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
// 고객에 대한 정보
typedef struct __ct {
int num, enter;
int rooma, roomb, starta, enda, startb, endb;
__ct() :
num(0), enter(0), rooma(0), roomb(0), starta(0), enda(0), startb(0), endb(0) {}
__ct(int num, int enter, int rooma, int roomb, int starta, int enda, int startb, int endb) :
num(num), enter(enter), rooma(rooma), roomb(roomb), starta(starta), enda(enda), startb(startb), endb(endb) {}
} CT;
// 방에 대한 정보
typedef struct __rminfo {
int num, endtime;
__rminfo() : num(0), endtime(0) {}
__rminfo(int num, int endtime) : num(num), endtime(endtime) {}
} RMINFO;
// 접수처 입장에 대한 정렬
bool cmpa(const CT& u, const CT& v) {
return u.num < v.num;
}
// 정비소 입장에 대한 정렬
bool cmpb(const CT& u, const CT& v) {
if (u.enda == v.enda) {
return u.rooma < v.rooma;
}
return u.enda < v.enda;
}
int atime[10], btime[10];
RMINFO aendtime[10], bendtime[10];
bool exitcheck[1001];
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int tc;
cin >> tc;
for (int test_case = 1; test_case <= tc; test_case++) {
memset(atime, 0, sizeof(atime));
memset(btime, 0, sizeof(btime));
memset(aendtime, 0, sizeof(aendtime));
memset(bendtime, 0, sizeof(bendtime));
memset(exitcheck, 0, sizeof(exitcheck));
int n, m, k, a, b;
cin >> n >> m >> k >> a >> b;
for (int i = 1; i <= n; i++) {
cin >> atime[i];
}
for (int i = 1; i <= m; i++) {
cin >> btime[i];
}
vector<CT> custom(k + 1);
for (int i = 1; i <= k; i++) {
custom[i].num = i;
cin >> custom[i].enter;
}
int idx = 1;
deque<CT> waita, waitb;
for (int t = 0; ; t++) {
bool ok = true;
for (int i = 1; i <= k; i++) {
if (!exitcheck[i]) {
ok = false;
break;
}
}
if (ok) {
break;
}
for (int i = 1; i <= m; i++) {
if (t > 0 && bendtime[i].endtime == t) {
exitcheck[bendtime[i].num] = true;
bendtime[i].num = 0;
bendtime[i].endtime = 0;
}
}
for (int i = 1; i <= n; i++) {
if (t > 0 && aendtime[i].endtime == t) {
waitb.push_back(custom[aendtime[i].num]);
aendtime[i].num = 0;
aendtime[i].endtime = 0;
}
}
for (int i = idx; i <= k; i++) {
if (custom[i].enter == t) {
waita.push_back(custom[i]);
idx = i + 1;
}
else {
break;
}
}
sort(waita.begin(), waita.end(), cmpa);
for (int i = 1; i <= n; i++) {
if (waita.empty()) break;
if (aendtime[i].endtime == 0) {
custom[waita.front().num].rooma = i;
custom[waita.front().num].starta = t;
custom[waita.front().num].enda = t + atime[i];
aendtime[i].num = waita.front().num;
aendtime[i].endtime = t + atime[i];
waita.pop_front();
}
}
sort(waitb.begin(), waitb.end(), cmpb);
for (int i = 1; i <= m; i++) {
if (waitb.empty()) break;
if (bendtime[i].endtime == 0) {
custom[waitb.front().num].roomb = i;
custom[waitb.front().num].startb = t;
custom[waitb.front().num].endb = t + btime[i];
bendtime[i].num = waitb.front().num;
bendtime[i].endtime = t + btime[i];
waitb.pop_front();
}
}
}
int ans = 0;
for (int i = 1; i <= k; i++) {
if (custom[i].rooma == a && custom[i].roomb == b) {
ans += i;
}
}
if (ans == 0) ans = -1;
cout << "#" << test_case << " " << ans << '\n';
}
return 0;
}
view raw swea2477.cpp hosted with ❤ by GitHub

'알고리즘 > 삼성' 카테고리의 다른 글

삼성 5650 핀볼 게임  (0) 2019.09.08
4012 요리사  (0) 2019.08.09
5656 벽돌 깨기  (0) 2019.08.08
4008 숫자 만들기  (0) 2019.08.08
5644 무선 충전  (0) 2019.08.08