알고리즘 및 자료구조/이분탐색
[알고리즘] C++ 백준 14921 용액 합성하기
Sh_Blog
2024. 2. 13. 12:49
백준 14921
https://www.acmicpc.net/problem/14921
14921번: 용액 합성하기
홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당신
www.acmicpc.net
풀이 전 나의 생각
얼마전에 풀었던 용액 문제와 똑같은 유형이다.
https://tjdgh7419.tistory.com/151
[알고리즘] C++ 백준 2467 용액
백준 2467 https://www.acmicpc.net/problem/2467 2467번: 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이
tjdgh7419.tistory.com
하지만 이전에 풀었던 용액 문제와 다른점은
최소가 되는 합성 용액의 시작과 끝을 출력하는 것이 아닌
실제로 합쳐진 용액의 양을 출력해야한다.
따라서 기존에 용액의 합을 절대값으로 구하여
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;
}