Muscardinus
컨베이어 벨트 위의 로봇 본문
728x90
https://www.acmicpc.net/problem/20055
20055번: 컨베이어 벨트 위의 로봇
길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부
www.acmicpc.net
#include <iostream>
using namespace std;
int N, K;
int ret = 0;
int belt[200];
int zero_cnt = 0;
int queue[200 * 1000];
int head, tail;
void init() {
cin >> N >> K;
for (int i = 0; i < N * 2; i++) {
cin >> belt[i];
}
}
void rotate() {
int temp = belt[2*N - 1];
for (int i = 2 * N - 1; i >= 0; i--) {
belt[i] = belt[i - 1];
}
belt[0] = temp;
}
void run() {
while (zero_cnt < K) {
ret++;
// 1번 벨트와 로봇 같이 이동
rotate();
for (int i = head; i < tail; i++) {
++queue[i];
if (queue[i] == N - 1) head++;
}
// 2번 로봇이 자발적으로 이동
for (int i = head; i < tail; i++) {
int next = queue[i] + 1;
if (belt[next] == 0 || (queue[i - 1] == next && i != head)) continue;
queue[i] = next;
if (queue[i] == N - 1) head++;
belt[next]--;
if (belt[next] == 0) zero_cnt++;
}
// 3번 0번째 벨트에 로봇을 놓을 때
if (belt[0] && (queue[tail - 1] != 0 || tail == 0)) {
queue[tail++] = 0;
belt[0]--;
if (belt[0] == 0) zero_cnt++;
}
}
}
int main() {
init();
run();
cout << ret;
return 0;
}
728x90
Comments