[백준 16938번 C/C++] 캠프 준비
[백준 16938번 C/C++] 캠프 준비
https://www.acmicpc.net/problem/16938
해결전략
비트마스킹 Bitmasking
백트래킹 Backtacking
정답코드
#include <iostream>
#include <vector>
using namespace std;
int n, l, r, x; // 문제의 개수, 난이도 합의 최소값, 난이도 합의 최대값, 가장 어려운 문제와 쉬운 문제의 난이도 차이 최소값
vector<int> A; // 각 문제의 난이도
int answer; // 조건을 만족하는 경우의 수
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> l >> r >> x;
A.resize(n);
for (int i = 0; i < n; i++){
cin >> A[i];
}
// 모든 부분집합을 비트마스크를 이용해 탐색
for (int bitmask = 1; bitmask < (1 << n); bitmask++)
{
int sumProblems = 0; // 선택한 문제 난이도의 합
int easiest = 987654321, hardest = 0; // 선택한 문제들 중 가장 쉬운 문제 난이도, 가장 어려운 문제 난이도
// 비트마스크를 이용해 부분집합 구성
for (int i = 0; i < n; i++)
{
if (bitmask & (1 << i)) // i번째 문제가 선택되었는지 확인
{
sumProblems += A[i]; // 선택된 문제 난이도 합산
easiest = min(easiest, A[i]); // 가장 쉬운 문제 업데이트
hardest = max(hardest, A[i]); // 가장 어려운 문제 업데이트
}
}
// 문제의 난이도 합이 l 이상 r 이하이고, 가장 어려운 문제와 가장 쉬운 문제의 난이도 차이가 x 이상인 경우
if (l <= sumProblems && sumProblems <= r && (hardest - easiest) >= x){
answer++; // 조건을 만족하면 경우의 수 증가
}
}
cout << answer;
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 11723번 C/C++] 집합 (0) | 2024.08.05 |
---|---|
[백준 1052번 C/C++] 물병 (0) | 2024.08.05 |
[백준 2961번 C/C++] 도영이가 만든 맛있는 음식 (0) | 2024.08.01 |
[백준 2800번 C/C++] 괄호 제거 (0) | 2024.07.31 |
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를 (0) | 2024.07.30 |
댓글
이 글 공유하기
다른 글
-
[백준 11723번 C/C++] 집합
[백준 11723번 C/C++] 집합
2024.08.05 -
[백준 1052번 C/C++] 물병
[백준 1052번 C/C++] 물병
2024.08.05 -
[백준 2961번 C/C++] 도영이가 만든 맛있는 음식
[백준 2961번 C/C++] 도영이가 만든 맛있는 음식
2024.08.01 -
[백준 2800번 C/C++] 괄호 제거
[백준 2800번 C/C++] 괄호 제거
2024.07.31