※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 5526번 문제인 ダーツ (Darts)이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/5526
네 개 이하의 다트로 얻을 수 있는 점수의 모든 합은 두 개 이하의 다트로 얻을 수 있는 점수의 합 두 개의 조합으로 항상 나타낼 수 있음을 관찰하자.
한편, 다트 하나를 사용하지 않은 것은 가상의 0점 영역에 다트를 던진 것으로 생각해도 결과가 같으므로, 이는 0점 영역을 추가한 후 다트를 항상 2개 사용하는 경우에 대한 문제로 바꿔 생각할 수 있다. 따라서, 위와 같이 변형된 상황에 대하여 두 개의 다트로 얻을 수 있는 점수 조합을 모두 구해둔 뒤, 이분탐색 또는 투포인터로 \(M\) 이하의 가능한 최댓값을 구해 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
int N, M, idx;
int A[1001001];
int ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) cin >> A[i];
idx = N;
for (int i = 0; i <= N; i++) {
for (int j = i; j <= N ;j++) {
A[++idx] = A[i] + A[j];
}
}
N = idx + 1;
sort(A, A + N);
for (int L = 0, R = N - 1; L <= R; 1) {
if (A[L] + A[R] > M) R--;
else {
ans = max(ans, A[L] + A[R]);
L++;
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 32383 // C++] 점프 (2) | 2024.10.23 |
---|---|
[BOJ 6248 // C++] Bronze Cow Party (1) | 2024.10.22 |
[BOJ 1229 // C++] 육각수 (1) | 2024.10.18 |
[BOJ 1341 // C++] 사이좋은 형제 (2) | 2024.10.17 |
[BOJ 23615 // C++] Product (4) | 2024.10.16 |