- https://www.acmicpc.net/problem/20055

 

문제가 좀 헷갈리게 써있습니다...

몇가지 주의사항을 보자면

  • 내리는 위치가 2N이 아니고 N임
    컨베이어는 1~2N까지 돌아감
  • 내리는 위치에 로봇이 도달하면 바로 내림
  • 로봇이 이동할 때 먼저 올라간 로봇부터 이동함
  • 벨트가 회전할 때는 내구도가 줄지 않음
  • (1->2->3->4) 이 전체가 한 단계임. 다 완료해야 한 단계인 것이 아니고, 1 이라도 진입하면 한 단계로 침

아무튼 이 점 주의해서 풀면 됩니다

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif //ONLINE_JUDGE

    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int N, K;
    cin >> N >> K;

    vector<int> A(2*N);   // 내구
    vector<bool> occupied(2*N, false);
    for (auto& item : A)
        cin >> item;

    int counter = 0;
    while (true) {
        ++counter;

        // 1.
        rotate(occupied.rbegin(), occupied.rbegin() + 1, occupied.rend());
        rotate(A.rbegin(), A.rbegin() + 1, A.rend());
        occupied[N-1] = false;

        // 2.
        for (int i=N-2; i>=0; --i) {
            if (occupied[i] && A[i+1] && !occupied[i+1]) {
                swap(occupied[i], occupied[i+1]);
                --A[i+1];
            }
        }
        occupied[N-1] = false;


        // 3.
        if (A[0]) {
            occupied[0] = true;
            --A[0];
        }

        // 4.
        if (count_if(A.begin(), A.end(), [](bool item) { return item==0; }) >= K) {
            break;
        }
    }

    cout << counter;

    return 0;
}

배열을 한칸씩 밀고 하는건 std::rotate를 활용하면 매우 편리합니다.

그리고 칸 수 세는건 std::count_if 써주면 역시 편하고요

STL을 적극 활용해주세요

반응형