[백준 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[백준 11723번 C/C++] 집합 https://www.acmicpc.net/problem/11723 해결전략 비트마스킹 Bitmasking 정답 코드 #include using namespace std;int m;int answer;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> m; string input, int x; for (int i = 0; i > input; if (input == "add"){ cin >> x; answer |= (1 > x; answer &= ~(1 > x; if (answer & (1 > x; answer ^= (1 -
[백준 1052번 C/C++] 물병
[백준 1052번 C/C++] 물병
2024.08.05[백준 1052번 C/C++] 물병 https://www.acmicpc.net/problem/1052 해결전 수학 그리디 알고리즘 비트마스킹 각 물병은 서로 다른 물병과 합쳐질 수 있다. 이 합치는 과정은 물병의 2진수로 표현한다.예를 들어, 물병 3개(2진수로 11)를 2개씩 합치면 2진수 100이 되어 물병 1개가 된다. 물병을 모두 합쳐서 k개의 물병 이하로 만들어야 한다.n이 k보다 작거나 같으면 추가 물병이 필요 없으므로 0을 반환합니다.비트마스킹n의 2진수 표현에서 1의 개수는 현재 물병의 수가 어떻게 조합될 수 있는지를 나타낸다.int BitCnt(int x)n의 2진수 표현에서 1의 개수가 k보다 많으면, 물병을 추가하여 이 개수를 줄여야 한다. 이를 위해 n을 하나씩 증가시키면서 1의 … -
[백준 2961번 C/C++] 도영이가 만든 맛있는 음식
[백준 2961번 C/C++] 도영이가 만든 맛있는 음식
2024.08.01[백준 2961번 C/C++] 도영이가 만든 맛있는 음식 https://www.acmicpc.net/problem/2961 해결전략 비트마스킹 Bitmasking 처음 시도한 코드 - 시간초과 #include #include #include using namespace std;int n;long long answer = 987654321;vector sour, bitter;vector> taste;void DFS(int idx, vector& ch, set& foods){ if (idx == n){ long long sour = 1, bitter = 0; for (auto& iter : foods){ sour *= taste[iter].first; bitter += taste[iter].s… -
[백준 2800번 C/C++] 괄호 제거
[백준 2800번 C/C++] 괄호 제거
2024.07.31[백준 2800번 C/C++] 괄호 제거 https://www.acmicpc.net/problem/2800 해결전략 문자열재귀비트마스킹 Bitmasking 정답코드 1 - 비트마스킹 사용 #include #include #include #include using namespace std;string input; // 문제에서 주어진 문자열int n;vector> brackets; // 괄호 한 쌍의 위치를 저장set results; // 만들 수 있는 문자열을 기록// 괄호 쌍의 위치를 찾는 함수void FindBrackets(){ stack bracketLocation; // 문자열을 순회하며 괄호 쌍을 찾음 for (int i = 0; i ch){ if (idx == n){ resul…
댓글을 사용할 수 없습니다.