A. Domino on Windowsill

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, k1, k2;
        cin >> n >> k1 >> k2;
        int w, b;
        cin >> w >> b;
        if(w+b > n){
            cout << "NO\n";
            continue;
        }
        int minw, maxw;
        minw = min(k1, k2);
        maxw = max(k1, k2);
        if(minw + (maxw-minw)/2 < w){
            cout << "NO\n";
            continue;
        }
        int minb, maxb;
        minb = min(n-k1, n-k2);
        maxb = max(n-k1, n-k2);
        if(minb + (maxb-minb)/2 < b){
            cout << "NO\n";
            continue;
        }
        cout << "YES\n";
    }
    return 0;
}

2 x n 크기의 격자가 있다. k1, k2 는 각 행의 흰색인 셀의 개수를 나타내고 w, b 는 2 x 1 크기의 흰, 검 도미노 타일의 개수를 나타낸다. 도미노 타일을 같은 색깔의 격자 위에 수직, 수평 방향으로 놓을 때, 주어진 개수만큼 모두 놓을 수 있는지를 묻고 있다.

도미노를 최대로 놓으려면 같은 색의 셀이 모여 있는것이 유리하다. 행마다 존재할 수 있는 셀의 개수는 정해져 있으므로 두 행의 셀을 각각 흰, 검 순서로 구분지었을 때가 타일을 최대로 놓을 수 있는 경우이다.

타일 개수가 작은 행의 셀 만큼 수직 방향으로 도미노를 놓을 수 있고, 타일 개수가 큰 행의 나머지 셀 / 2 개수만큼 수평으로 도미노를 놓을 수 있다.

후기

dp 문제가 나오면 설계하는 시간을 길게 가져야 할 것 같다. 너무 급하게 구현부터 하는 바람에 B번을 풀지 못했다. 오늘도 한 문제밖에 풀지 못했다.

'Codeforces' 카테고리의 다른 글

Codeforces #1476A K-divisible Sum  (0) 2021.03.24
Codeforces #1480B The Great Hero  (0) 2021.03.22
Codeforces Round #708 (Div. 2) A  (0) 2021.03.19
Codeforces #1501B Napoleon Cake  (0) 2021.03.16
Codeforces #1501A Alexey and Train  (0) 2021.03.14

댓글