[伯俊]BOJ 2470両溶液JAVA


BOJ 2470両溶液

質問する


KOI建設科学研究所は多様な酸性溶液とアルカリ性溶液を持っている.各溶液には整数があり、その溶液の特性を表す.酸性溶液の特性値は、1〜10000000の正の整数で表され、塩基性溶液の特性値は−1〜10000000の負の整数で表される.
2つの溶液を等量混合した溶液の特性値は、混合に用いられる各溶液の特性値の和として定義される.この研究所は等量の2種類の溶液を混合し,特性値が最もゼロに近い溶液を作製しようとしている.
例えば、与えられた溶液の特性値が[2,4,−99,−1,98]であり、特性値が−99の溶液と特性値が98の溶液とを混合すると、特性値が−1の溶液が得られ、この溶液は特性値が最も0に近い溶液である.ちなみに、特性値が0に近い混合溶液を2種類のアルカリ溶液または2種類の酸性溶液のみで製造する場合もある.
酸性溶液とアルカリ性溶液の特性値が与えられている場合は、2つの異なる溶液を混合し、特性値が0に近い2つの溶液を見つけるプログラムを作成します.

入力


1行目は、溶液全体の数Nを入力する.Nは2以上100000以下である.2行目には、溶液特性値を表すN個の整数が与えられ、その間にスペースが隔てられている.これらの数字はいずれも-10000000以上10000000以下です.N個の溶液の特性値が異なり、酸性溶液またはアルカリ性溶液のみが入力される場合もある.

しゅつりょく


1行目の出力特性値は0に近い2つの溶液の特性値である.出力が必要な2種類の溶液は特性値の昇順に出力される.プロパティ値が0の場合、2つ以上の場合、いずれかを出力します.

サンプルI/O



ソースコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);

        int start = 0;
        int end = n - 1;
        int max = Integer.MAX_VALUE;

        int ans1 = 0, ans2 = 0;

        while (start < end) {
            int sum = arr[start] + arr[end];

            if (max > Math.abs(sum)) {
                max = Math.abs(sum);
                ans1 = arr[start];
                ans2 = arr[end];
            }

            if (sum > 0) {
                end--;
            } else {
                start++;
            }
        }

        System.out.println(ans1 + " " + ans2);
    }
}

Comment

  • の負数と正数を計算し、0に近い場合は倹約値を使用すればよい.
  • ただし、
  • を使用するとタイムアウトが発生します.Scanner()
  • が望ましい