문제

https://codeforces.com/problemset/problem/1486/A

걸린 시간

02 : 19 : 00

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        int n;
        cin >> n;
        vector<ll> h(n), s(n);
        for(int i = 0; i < n; i++){
            cin >> h[i];
            s[i] = i;
        }
        for(int i = 1; i < n; i++){
            h[i] += h[i-1];
            s[i] += s[i-1];
        }
        bool increase = true;
        for(int i = 1; i < n; i++)
            if((h[n-1-i]-s[n-1-i])+(h[n-i]-h[n-i-1]) < n-i) increase = false;
        if(increase) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}

n개의 스택 h 가 있고 각각 블록이 hi 개 만큼 담겨 있다. 한번에 i 번째 스택의 블록 하나를 i+1 번째 스택으로 이동시킬 수 있다고 할 때, 스택의 높이 hi 순서가 정확히 증가하도록 만들 수 있는지를 묻는 문제이다.

조건에서는 항상 낮은 인덱스에서 높은 인덱스로만 블록의 이동이 가능하다고 했다. 스택에 블록이 아무리 많아도 앞에 있는 스택으로는 블록을 이동시킬 수 없으므로 뒤로 이동시킬 수 있는 블록의 개수가 충분한지를 검사하면 된다.

문제에서 주어진 스택 배열 h 와, 조건을 만족시키는 최소 블록 개수의 스택 배열 s {0, 1, 2, 3,...} 의 구간 합(prefix sum) 을 구해두면 편리하게 구현이 가능하다.

반복문으로 제어되는 변수, 0부터 시작하는 배열 인덱스 때문에 코드가 많이 복잡해졌고, 변수를 두어 따로 관리하지 않아 정확한 인덱스 계산이 어려웠다.

'Codeforces' 카테고리의 다른 글

Codeforces #1485A Add and Divide  (0) 2021.03.02
Codeforces #1491A K-th Largest Value  (0) 2021.03.02
Codeforces #1487A Arena  (0) 2021.02.28
Codeforces #1490A Dense Array  (0) 2021.02.28
Codeforces #1492A Three swimmers  (0) 2021.02.28

댓글