/* 다시 짜보도록 하겠습니다. 최대한 예정와 동일하게. 이름도 현상도 똑같이. 먼저 입력은 전부 받고, 접수대에 대해서만 짜보도록 하겠습니다. 1에서 받은 고객 && 2에서 정비한 고객 걸러내면 됩니다. */ #include <iostream> #include <queue> using namespace std; int N, M, A, B; int a[10], b[10]; int n[10], m[10]; int K; int t[1001]; int A_log[1001]; int B_log[1001]; int index, index2; int sum; int ans; int sec; queue<int> recep_waiting, repair_waiting; int time_store[21]; void problemIn() { cin >> N >> M >> K >> A >> B; for (int i = 1; i <= N; i++) { cin >> a[i]; } for (int i = 1; i <= M; i++) { cin >> b[i]; } for (int i = 1; i <= K; i++) { cin >> t[i]; } } /* 0 1 2 3 1 2 5 6 1 3 6 이렇게 가정하면 A 와 B 가 동시에 있는 숫자를 찾으면 됩니다. */ void init() { /*for (int i = 0; i < 10; i++) { a[i] = 0; b[i] = 0; n[i] = 0; m[i] = 0; }*/ for (int i = 0; i < K+1; i++) { t[i] = A_log[i] = B_log[i] = 0; } index = index2 = sum = ans = 0; } void find_ans() { ans = 0; for (int i = 0;; i++) { for (int j = 0;; j++) { if (A_log[i] == B_log[j]) { ans += A_log[i]; } if (B_log[j] == 0) break; } if (A_log[i] == 0) break; } if (ans == 0) ans = -1; } void solve() { index = index = 0; sec = 0; while (1) { // waiting mgn for (int i = 1; i <= K; i++) { if (t[i] == sec) { recep_waiting.push(i); // 시간이 되면 waiting 에 넣습니다. } } // 접수대 넣기 for (int i = 1; i <= N; i++) { if (n[i] == 0) { if (!recep_waiting.empty()) { n[i] = recep_waiting.front(); recep_waiting.pop(); if (i == A) { A_log[index++] = n[i]; } time_store[i] = sec; } } } // 정비소에 넣기 for (int i = 1; i <= M; i++) { if (m[i] == 0) { if (!repair_waiting.empty()) { m[i] = repair_waiting.front(); repair_waiting.pop(); if (i == B) { B_log[index2++] = m[i]; } time_store[N + i] = sec; // 2초가 들어갑니다. } } } // 여기까지가 예제와 같아야 합니다.해당 초에 웨이팅과 들어가있는 수, sec++; /* 초 있는 부분이 잘 못되었습니다. 2초간 유지 0초에 들어 왔으므로, 0,1 하고 2초가 되면 사라지면 됩니다. 그러므로 그 때 당시의 sec 을 저장하고 t = 2 3이 들어옴 2,3 하고 없어짐 3은 2초간 유지였던 것입니다. 당시 t = 2 이고 3,4 가 되면 없어지면 됩니다. 그럼 4 - 해당 시간 2초 일때 정비1 에 2가 들어갔습니다. 2,3,4,5 초까지 있다가 6초가 되면 그 자리를 비워두어야 다른 것이 6초때에 들어옵니다. */ // 접수대 빼기 if (sum > 0) { for (int i = 1; i <= N; i++) { if (sec - time_store[i] == a[i]) { repair_waiting.push(n[i]); n[i] = 0; } } } // 정비소에서 뺴기 for (int i = 1; i <= M; i++) { if (sec - time_store[N + i] == b[i]) { m[i] = 0; } }
/* 죵료 조건을 어떻게 넣어야 하는지 고민해보도록 하겠습니다. 어떻게 넣어야 하지? 잠깐, 종료조건에 대해서도 한번 고민을 해보도록 하겠습니다. */ sum = 0; for (int i = 1; i <= N; i++) { sum += n[i]; } for (int i = 1; i <= M; i++) { sum += m[i]; } if (sum == 0 && sec > t[K] && recep_waiting.size()==0 && repair_waiting.size()==0) break; }
find_ans(); } int main(void) { int T; cin >> T; for(int i=1; i<=T; i++) { init(); problemIn(); solve(); cout << "#" << i << " " << ans << endl; } return 0; } |
스트럭쳐를 만들어서 풀이하는 것이 중요합니다. 왜냐하면 기억해야할 정보들을 배열로 가지고 가는 것보다, 구조체를 정의해서 변수로 저장해서 가는게 좋습니다. 배열 3차원으로 넘어가면 관리하기가 까다롭기 때문입니다. 센터에는 n,w,t 이고, 에이센터와 비센터가 있습니다. 오께이. 이렇게 엔은 사람넘버, 더블유는 오꼐이 한번 변수들을 디버깅하면서 따라가보도록 하겠습니다. 그래야 변수들간의 관계를 명확히 파악할 수 있습니다. |