Muscardinus

컨베이어 벨트 위의 로봇 본문

카테고리 없음

컨베이어 벨트 위의 로봇

Muscardinus 2021. 10. 6. 23:59
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