コーディングテスト練習記録
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値は 増加する.最小値比較コード繰り返し、先に比較した後に比較する
白準2470号(2種類の溶液)
質問する
KOI建設科学研究所は多様な酸性溶液とアルカリ性溶液を持っている.各溶液には整数があり、その溶液の特性を表す.酸性溶液の特性値は、1〜10000000の正の整数で表され、塩基性溶液の特性値は−1〜10000000の負の整数で表される.
2つの溶液を等量混合した溶液の特性値は、混合に用いられる各溶液の特性値の和として定義される.この研究所は等量の2種類の溶液を混合し,特性値が最もゼロに近い溶液を作製しようとしている.
例えば、与えられた溶液の特性値が[2,4,−99,−1,98]であり、特性値が−99の溶液と特性値が98の溶液とを混合すると、特性値が−1の溶液が得られ、この溶液は特性値が最も0に近い溶液である.ちなみに、特性値が0に近い混合溶液を2種類のアルカリ溶液または2種類の酸性溶液のみで製造する場合もある.
酸性溶液とアルカリ性溶液の特性値が与えられている場合は、2つの異なる溶液を混合し、特性値が0に近い2つの溶液を見つけるプログラムを作成します.
私の答え
2つの
2つの
2つの
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++;
}
}
Reference
この問題について(コーディングテスト練習記録), 我々は、より多くの情報をここで見つけました https://velog.io/@jgjgill/코딩테스트-연습-기록-hdm65fhwテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol