[白俊20055]コンベアのロボット


A.方法


「シミュレーション」問題では,問題の条件に従って逐次実施すればよい.

B.実施

  • ベルトは、各車両の上のロボットとともに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;
    }
    いつロボットが降りる位置に着いても、すぐに降ります.
    vector<int>::iterator itr;
        itr = find(robot.begin(), robot.end(), N - 1);
        if(itr != robot.end()) {
            robot.erase(itr);
        }
    最初にベルトをつけたロボットから、ベルトが回転する方向に1マス移動できるようになったら移動します.移動できないなら、おとなしくしています.
  • ロボットが移動するには、移動する車両内にロボットがなく、その車両の耐久度が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]--;
            }
        }
  • アップロード位置の格子耐久度が0でない場合は、ロボットをアップロード位置にアップロードします.
  •  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);
            }
        }
  • 耐久度が0の格子数がK個を超えると、プロセスは終了する.さもないと1番に戻ります.
  • 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.結果