コーディングテスト練習記録

12871 ワード

2022.02.25 62日目
白準2470号(2種類の溶液)
質問する
KOI建設科学研究所は多様な酸性溶液とアルカリ性溶液を持っている.各溶液には整数があり、その溶液の特性を表す.酸性溶液の特性値は、1〜10000000の正の整数で表され、塩基性溶液の特性値は−1〜10000000の負の整数で表される.
2つの溶液を等量混合した溶液の特性値は、混合に用いられる各溶液の特性値の和として定義される.この研究所は等量の2種類の溶液を混合し,特性値が最もゼロに近い溶液を作製しようとしている.
例えば、与えられた溶液の特性値が[2,4,−99,−1,98]であり、特性値が−99の溶液と特性値が98の溶液とを混合すると、特性値が−1の溶液が得られ、この溶液は特性値が最も0に近い溶液である.ちなみに、特性値が0に近い混合溶液を2種類のアルカリ溶液または2種類の酸性溶液のみで製造する場合もある.
酸性溶液とアルカリ性溶液の特性値が与えられている場合は、2つの異なる溶液を混合し、特性値が0に近い2つの溶液を見つけるプログラムを作成します.
私の答え
  • 0に近い2つの数字を探して、時間の複雑さ-二重ポインタを考慮して、昇順に
  • 並べ替えます.
  • 負または正の節電値(Math.abs)
  • start、終了値を設定し、文は
  • 繰り返します.
    2つの
  • の絶対値の和が最小値より小さい場合、最小値を置換し、2つの正しい値
  • を置換する.
    2つの
  • の絶対値の和が0より大きい場合、終了値は
  • 減少する.
    2つの
  • の絶対値の和が0未満の場合、start値は
  • 増加する.
    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            int n = Integer.parseInt(st.nextToken());
    
            long[] nArr = new long[n];
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < n; i++) {
                long temp = Integer.parseInt(st.nextToken());
                nArr[i] = temp;
            }
    
            Arrays.sort(nArr);
    
            long answer1 = 0;
            long answer2 = 0;
    
            int start = 0;
            int end = n - 1;
    
            long min = Integer.MAX_VALUE;
    
            while (start < end) {
                long temp = Math.abs(nArr[end] + nArr[start]);
                if (nArr[end] + nArr[start] > 0) {
                    if (min > temp) {
                        min = temp;
                        answer1 = nArr[start];
                        answer2 = nArr[end];
                    }
                    end--;
    
                } else {
                    if (min > temp) {
                        min = temp;
                        answer1 = nArr[start];
                        answer2 = nArr[end];
                    }
                    start++;
                }
            }
            System.out.print(answer1 + " " + answer2);
    
        }
    }
    考える
  • 最小値比較コード繰り返し、先に比較した後に比較する
     while (start < end) {
                long temp = Math.abs(nArr[end] + nArr[start]);
                if (min > temp) {
                    min = temp;
                    answer1 = nArr[start]; answer2 = nArr[end];
                }
                if (nArr[end] + nArr[start] > 0) {
                    end--;
                } else {
                    start++;
                }
            }