백준 14921
https://www.acmicpc.net/problem/14921
풀이 전 나의 생각
얼마전에 풀었던 용액 문제와 똑같은 유형이다.
https://tjdgh7419.tistory.com/151
하지만 이전에 풀었던 용액 문제와 다른점은
최소가 되는 합성 용액의 시작과 끝을 출력하는 것이 아닌
실제로 합쳐진 용액의 양을 출력해야한다.
따라서 기존에 용액의 합을 절대값으로 구하여
0으로부터 양이 얼마나 되는지 판단 후 최소값을 갱신시키는 과정에서
따로 용액의 순수하게 합친 양을 구해주며 갱신해줘야한다.
if (abs(comp_liq) < MIN)
{
MIN = abs(comp_liq);
ans = comp_liq;
}
최종값을 갱신시켜주며 이분탐색을 진행하면 문제를 해결할 수 있다.
풀이
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <string>
#include <queue>
#include <string.h>
#include <limits.h>
#include <cstdio>
using namespace std;
int liq[100001];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> liq[i];
}
int start = 0;
int end = N - 1;
int MIN = INT_MAX;
int ans = 0;
while (start < end)
{
int comp_liq = liq[start] + liq[end];
if (abs(comp_liq) < MIN)
{
MIN = abs(comp_liq);
ans = comp_liq;
}
if (comp_liq < 0)
{
start++;
}
else
{
end--;
}
}
cout << ans;
}
'알고리즘 및 자료구조 > 이분탐색' 카테고리의 다른 글
[알고리즘] C++ 백준 3151 합이 0 (2) | 2024.02.15 |
---|---|
[알고리즘] C++ 백준 2295 세 수의 합 (0) | 2024.02.14 |
[알고리즘] C++ 백준 2467 용액 (1) | 2024.02.08 |
[알고리즘] C++ 백준 18869 멀티버스 Ⅱ(좌표 압축) (2) | 2024.02.07 |
[알고리즘] C++ 백준 16401 과자 나눠주기 (1) | 2024.02.06 |