728x90
개요
https://www.acmicpc.net/problem/2467
골드5 난이도 문제다.
풀이
특성값의 합이 0에 가까운 두 용액을 찾아야 한다.
용액의 특성값을 정렬한 후 투 포인터를 사용해 풀었다.
front(가장 작은 값)과 end(가장 큰 값) 일 비교한다.
0보다 클 경우 end-1 하여 감소시키고 0보다 클 경우 front+1을 해주어 증가시킨다.
위를 반복하며 0과 가장 가까운 조합을 찾아낸다.
여러 답중 아무거나 출력해도 되므로 그냥 출력하면 된다.
코드
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
constexpr int LIMIT = 100002;
int N;
int water[LIMIT];
int ansFront, ansBack;
void TwoPointer()
{
int front = 0;
int back = N - 1;
long long sum = 0;
long long ansSum = 10000000000;
while (front != back && ansSum)
{
sum = water[front] + water[back];
if (abs(ansSum) > abs(sum))
{
ansSum = sum;
ansFront = water[front];
ansBack = water[back];
}
if (sum < 0) front++;
else back--;
}
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> water[i];
}
TwoPointer();
cout << ansFront << " " << ansBack;
}
'알고리즘&자료구조 > 문제' 카테고리의 다른 글
[BOJ] 7453 합이 0인 네 정수 C++ (0) | 2023.02.23 |
---|---|
[BOJ] 2473 세 용액 C++ (0) | 2023.02.23 |
[BOJ] 10025 게으른 백곰 C++ (1) | 2023.02.20 |
[BOJ] 16953 A → B C++ (0) | 2023.02.20 |
[BOJ] 12851 숨바꼭질 2 C++ (0) | 2023.02.20 |