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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
'알고리즘 > 삼성' 카테고리의 다른 글
삼성 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 |