ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14921번: 용액 합성하기
    정렬(Sort) 2018. 7. 3. 10:52
    반응형

    https://www.acmicpc.net/problem/14921


    1. 문제

    홍익대 화학연구소는 다양한 용액을 보유하고 있다.  각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데,


    같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다.


    당신은 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 하는데, 각 용액은 10ml시험관에 10ml씩 들어있고, 빈 20ml 시험관이 단 하나 있다.  게다가 용액을 계량할 수 없어서, 두 용액을 섞을 때는 10ml씩 섞어서 20ml로 만드는데, 단 한번밖에 할 수 없다.  그래서 미리 용액의 특성값들을 보고, 어떤 두 용액을 섞을 것인지 정해야 한다.


    예를 들어, 연구소에 있는 용액들의 특성값이 [-101, -3, -1, 5, 93]이라고 하자. 이 경우에 특성 값이 각각 -101, 93인 용액을 혼합하면 -8인 용액을 만들 수 있다. 또한 특성값이 5인 용액과 93인 용액을 혼합하면 특성 값이 98인 용액을 만들 수 있다.  모든 가능한 조합을 생각해 보면, 특성값이 2인 용액이 0에 가장 가까운 용액이다.


    용액들의 특성값 A_1, … ,A_N이 오름차순으로 주어졌을 때, 이 중 두 개의 용액을 혼합하여 만들 수 있는 0에 가장 가까운 특성값 B를 출력하시오.


    2. 알고리즘

    키워드 - 정렬


     * 접근

    나중에 정리 긴장하고 풀어서 기억 나지 않음.


    3. 코드


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <iostream>
    #include <algorithm> // min
    #include <functional>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <map>
     
    using namespace std;
     
    int main()
    {
        std::ios::sync_with_stdio(false);
        int n;
     
        cin >> n;
     
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
     
        int solution = 1000000001;
        bool negative = false;
     
        sort(a.begin(), a.end());
        int left = 0int right = n - 1;
     
        while (left < right) {
            int sum = a[left] + a[right];
            int cand = abs(- sum);
            if (abs(solution) > cand) {
                solution = sum;
            }
     
            if (solution == 0)
                break;
     
            if (abs(sum) >= abs(a[left] + a[right - 1]))
                right--;
            else if (right + < n && abs(sum) > abs(a[left] + a[right + 1]))
                right++;
            else
                left++;
        }
        cout << solution << "\n";
     
        return 0;
    }
    cs



    반응형

    '정렬(Sort)' 카테고리의 다른 글

    백준 2947번: 나무 조각  (1) 2018.07.16
    백준 1026번: 보물  (0) 2018.07.15
    백준 10989번: 수 정렬하기 3  (0) 2018.07.03
    백준 11004번: K번째 수  (0) 2018.06.24
    Codeforces Round #489 (Div. 2) : A. Nastya and an Array  (0) 2018.06.19

    댓글

Designed by Tistory.