[白俊20055]コンベアのロボット
5491 ワード
A.方法
「シミュレーション」問題では,問題の条件に従って逐次実施すればよい.
B.実施
//벨트의 상태를 한 칸 회전
int save = belt[2 * N - 1];
belt.pop_back();
belt.insert(belt.begin(), save);
//로봇의 상태를 한 칸 회전
for(auto it = robot.begin(); it != robot.end(); it++) {
int move = (*it) + 1;
if(move == 2 * N)
move = 0;
*it = move;
}
いつロボットが降りる位置に着いても、すぐに降ります.vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), N - 1);
if(itr != robot.end()) {
robot.erase(itr);
}
最初にベルトをつけたロボットから、ベルトが回転する方向に1マス移動できるようになったら移動します.移動できないなら、おとなしくしています.for(auto it = robot.begin(); it != robot.end(); it++) {
int next = (*it) + 1;
if(next == 2 * N)
next = 0;
int chk;
if(it == robot.begin()) {
chk = robot[robot.size() - 1];
}
else {
chk = *(it - 1);
}
if((chk != next) && (belt[next] >= 1)) {
(*it)++;
if(*it == 2 * N)
*it = 0;
belt[next]--;
}
}
if(belt[0] != 0) {
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), 0);
if(itr == robot.end()) {
belt[0]--;
robot.push_back(0);
}
}
for(auto it = belt.begin(); it != belt.end(); it++) {
if(*it == 0)
cnt++;
if(cnt >= K)
return stage;
}
C.コード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int T, N, K;
vector<int> belt;
vector<int> robot;
int solver(int stage) {
//1
int save = belt[2 * N - 1];
belt.pop_back();
belt.insert(belt.begin(), save);
for(auto it = robot.begin(); it != robot.end(); it++) {
int move = (*it) + 1;
if(move == 2 * N)
move = 0;
*it = move;
}
//Delete!!
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), N - 1);
if(itr != robot.end()) {
robot.erase(itr);
}
for(auto it = robot.begin(); it != robot.end(); it++) {
int next = (*it) + 1;
if(next == 2 * N)
next = 0;
int chk;
if(it == robot.begin()) {
chk = robot[robot.size() - 1];
}
else {
chk = *(it - 1);
}
if((chk != next) && (belt[next] >= 1)) {
(*it)++;
if(*it == 2 * N)
*it = 0;
belt[next]--;
}
}
//Delete
vector<int>::iterator itr2;
itr2 = find(robot.begin(), robot.end(), N - 1);
if(itr2 != robot.end()) {
robot.erase(itr2);
}
if(belt[0] != 0) {
vector<int>::iterator itr;
itr = find(robot.begin(), robot.end(), 0);
if(itr == robot.end()) {
belt[0]--;
robot.push_back(0);
}
}
int cnt = 0;
for(auto it = belt.begin(); it != belt.end(); it++) {
if(*it == 0)
cnt++;
if(cnt >= K)
return stage;
}
return solver(stage + 1);
}
int main() {
//scanf("%d", &T);
T = 1;
for(int tc = 0; tc < T; tc++) {
scanf("%d %d", &N, &K);
int tmp;
belt.resize(2 * N, 0);
robot.clear();
for(int i = 0; i < 2 * N; i++) {
scanf("%d", &tmp);
belt[i] = tmp;
}
printf("%d\n", solver(1));
}
return 0;
}
D.結果
Reference
この問題について([白俊20055]コンベアのロボット), 我々は、より多くの情報をここで見つけました https://velog.io/@pamrk2002/백준-20055컨베이어-벨트-위의-로봇テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol