[ 백준 ] 16938 / 캠프 준비

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
155/228
post-thumbnail

# Appreciation

/*
 * Problem :: 16938 / 캠프 준비
 *
 * Kind :: Bitmask
 *
 * Insight
 * - max(N)=15
 *   + 2^15 = 32768 < 2*10^8
 *     # 가능한 조합을 다 만들어봐도 시간 제한내에 풀 수 있다
 *       -> 15 < 32 이니, 비트마스크로 풀어보자
 *
 * Point
 * - 가장 어려운문제와 쉬운 문제를 편하게 알기 위해
 *   난이도가 들어있는 배열 A 를 오름차순으로 정렬하였다
 *   + 1~i 번째 문제중 2,3,5,7 번째 문제를 뽑았다면
 *     2번째 문제가 가장 난이도가 낮은 문제,
 *     7번째 문제가 가장 난이도가 높은 문제가 된다
 *
 * - 문제는 1번 부터 문제가 시작하지만
 *   코드에서는 편의상 0번 부터 문제가 시작되도록 하였다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>

using namespace std;

#define endl '\n'

// Set up : Global Variables
int N, L, R, X;
int A[15];

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    cin >> N >> L >> R >> X;
    for (int i=0; i<N; i++) {
        cin >> A[i];
    }

    // Process
    int ans = 0; /* 문제를 고르는 방법의 수 */
    sort(A, A+N); /* 난이도 오름차순으로 정렬 */
    for (int i=0; i<(1<<N); i++) {
        int bm = i; /* 비트마스크 */
        vector<int> diffs; /* 고른 문제가 저장된 Vector */
        for (int j=0; j<N; j++) {
            if (bm & (1<<j)) { /* 비트마스크를 이용하여 문제를 고름 */
                diffs.push_back(A[j]);
            }
        }

        if (diffs.size() >= 2) { /* 두 문제 이상이고 */
            int easiest = diffs.front(); /* 가장 쉬운 문제 */
            int hardest = diffs.back(); /* 가장 어려운 문제 */
            if (hardest - easiest >= X) { /* 난이도 차이가 X 보다 크거나 같고 */
                int sum = accumulate(diffs.begin(), diffs.end(), 0);
                if (sum >= L && sum <= R) { /* 난이도 합이 L 이상 R 이하이면 */
                    ans++; /* 가능한 방법을 하나 찾음 */
                }
            }
        }
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글