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] > 0break;
            }
 
            //접수 창구 배정하기
            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

+ Recent posts