관리 메뉴

Mini

백준 2470 두용액 c++ // 투포인터는 st,en중 누구를 움직일지 결정하라 본문

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;
}