- 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을 적극 활용해주세요
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][Java] 14013: Unit Conversion (0) | 2021.12.18 |
---|---|
[백준][C++] 1024: 수열의 합 (0) | 2021.03.19 |
[백준][C++] 2417: 정수 제곱근 (0) | 2020.10.30 |
[백준][C++] 10830: 행렬 제곱 (0) | 2020.10.30 |
[백준][C++] 1322: X와 K (0) | 2020.10.29 |