Algorithm/투포인터
백준 2470 두용액 c++ // 투포인터는 st,en중 누구를 움직일지 결정하라
Mini_96
2023. 12. 1. 14:41
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
1. 의사코드
1.1 st,en중 누구를 움직일지 결정하라
if (sum1 < 0) s++; // 합이음수->커져야함->음수를 줄임 -> st++
else e--; //합이양수 -> 작아져야함 -> 양수를 줄임 -> e++
1.2 변수 테이블을 정의하라 //ret : 현재까지 값중 0에 가장가까운 합
2. 전체코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,ret1= 1000000000*2 ,ret2 = 1000000000 * 2;
vector<int> v;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 0; i < n; ++i) {
int temp;
cin >> temp;
v.push_back(temp);
}
sort(v.begin(), v.end());
int ret = 1000000000 * 2; //0에 가장 가까운 합
int e = n-1;
int s = 0;
while (s < e) {
int sum1 = (v[s] + v[e]); //현재합
if (ret > abs(sum1)) { //0에 더 가까운 합이 있는경우 갱신
ret = abs(sum1);
ret1 = v[s];
ret2 = v[e];
if (sum1 == 0) break; //가장최적해인경우 탐색중단
}
if (sum1 < 0) s++; // 합이음수->커져야함->음수를 줄임 -> st++
else e--; //합이양수 -> 작아져야함 -> 양수를 줄임 -> e++
}
cout << ret1 << " " << ret2;
return 0;
}