PS

BOJ 16615 : Dropping Blocks

lickelon 2024. 7. 28. 23:15
  • 문제 링크 : boj.kr/16615
  • 난이도 : G2
  • 태그 : 애드혹

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<int> arr(n);
    for(auto &u : arr) cin >> u;
    
    int cnt = 0;
    for(int i = 1; i < n; i++) {
        if(arr[i] > arr[i-1]) {
            cnt += arr[i]-arr[i-1];
        }
        if(arr[i] < cnt) {
            cout << "NO";
            return 0;
        }
    }

    reverse(all(arr));
    cnt = 0;
    for(int i = 1; i < n; i++) {
        if(arr[i] > arr[i-1]) {
            cnt += arr[i]-arr[i-1];
        }
        if(arr[i] < cnt) {
            cout << "NO";
            return 0;
        }
    }
    cout << "YES";

    return 0;
}

풀이

연산을 오른쪽 끝까지 놓는 것과 왼쪽 끝까지 놓는 것 두 가지로 나눌 수 있다.

우선은 오른쪽 끝까지 놓는 연산만 고려해보자.

k번째부터 오른쪽 끝까지 놓는 연산을 수행하면, k-1번째 칸에 놓인 블럭보다 k번째 칸에 놓인 블럭이 하나 많아진다. 따라서 우린 i-1번째 칸의 블럭보다 i번째 칸의 블럭이 더 많다면, i번째 칸에 해당 연산이 수행되었음을 알 수 있다.

i번째 칸까지 연산이 x번 수행되었다면 이후의 칸에는 블럭이 x개 이상 있어야 한다.

이 조건을 만족하고, 반대의 경우도 만족한다면 이는 가능한 경우이다.

'PS' 카테고리의 다른 글

BOJ 2437 : 저울  (0) 2024.07.30
BOJ 2812 : 크게 만들기  (0) 2024.07.29
BOJ 1911 : 흙길 보수하기  (0) 2024.07.27
BOJ 2285 : 우체국  (0) 2024.07.26
BOJ 15469 : Mixing Coins  (0) 2024.07.25