SWEA::2477 차량 정비소
정말 까다로웠다.
문제 보고 머리로는 도저히 시뮬레이션이 안되서 그리면서 풀었는데
그리면서 시뮬레이션 하기도 쉽지 않았다.
이 문제에 대한 내 아이디어는 1초마다 시뮬레이팅을 통해 결과를 알아내려 했다.
그래서 다른분들에 비해 상대적으로 실행시간이 높은데 다른분들은 어떻게 했는지 모르겠다...
문제가 까다로우니 머리속에서 솔루션이 바로 떠오르지 않았고, 다 풀고도 굉장히 비효율적으로 했던 부분들을 많이 수정했다. 까다로운 문제에 대해서도 솔루션이 금방 떠오르도록 연습, 그리고 공부가 더 많이 필요할거 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <stdio.h> #include <queue> using namespace std; //창구 상태에 대한 구조체 //flag : 사용중인지 여부 //time : 몇초남았는지 //num : 몇번 사람이 이용중인지 struct Node { bool flag; int time; int num; void clear() { flag = 0; time = 0; num = 0; } }; int n, m, k, A, B; int a[10], b[10], t[1001]; bool check[1001], statT[1001]; Node usingA[10], usingB[10]; int main() { int tt; scanf("%d", &tt); for (int tc = 1; tc <= tt; tc++) { scanf("%d %d %d %d %d", &n, &m, &k, &A, &B); int res = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); usingA[i].time = a[i]; usingA[i].flag = false; } for (int i = 1; i <= m; i++) { scanf("%d", &b[i]); usingB[i].time = b[i]; usingB[i].flag = false; } for (int i = 1; i <= k; i++) { scanf("%d", &t[i]); statT[i] = 0; check[i] = 0; } queue<int> qa; queue<int> qb; int cnt = 0; // k명이 b번창구 에 배정받을 때까지 반복 while (true) { if (cnt == k) break; //접수 창구에 줄세우기 for (int i = 1; i <= k; i++) { if (t[i] == 0) { qa.push(i); t[i]--; } else if (t[i] > 0) break; } //접수 창구 배정하기 for (int i = 1; i <= n; i++) { if (qa.empty()) break; if (!usingA[i].flag) { //A번 창구에 들린 번호 체크 if (i == A) check[qa.front()] = true; usingA[i].flag = true; usingA[i].num = qa.front(); qa.pop(); } } //정비 창구 배정하기 for (int i = 1; i <= m; i++) { if (qb.empty()) break; if (!usingB[i].flag) { if (i == B) { //A번창구에 들렸고 //B번창구에 들렸으면 결과에 더해주기 if (check[qb.front()]) res += qb.front(); } usingB[i].flag = true; usingB[i].num = qb.front(); cnt++; qb.pop(); } } //1초 경과시키기 for (int i = 1; i <= n; i++) { if (usingA[i].flag) { usingA[i].time--; if (usingA[i].time == 0) { usingA[i].time = a[i]; usingA[i].flag = false; qb.push(usingA[i].num); } } } for (int i = 1; i <= m; i++) { if (usingB[i].flag) { usingB[i].time--; if (usingB[i].time == 0) { usingB[i].time = b[i]; usingB[i].flag = false; } } } for (int i = 1; i <= k; i++) { if (t[i] > 0) t[i]--; } } if (res == 0) res = -1; printf("#%d %d\n", tc, res); } } | cs |
'SWEA::문제풀이' 카테고리의 다른 글
3282 0/1 Knapsack (0) | 2018.02.18 |
---|---|
1949 등산로 조성 (0) | 2018.02.13 |
2115 벌꿀채취 (0) | 2018.01.30 |
1249 보급로 (0) | 2018.01.25 |
1953 탈주범 검거 (0) | 2018.01.23 |