1644.少数連続和
1.ダブルポインタの説明
2.問題リンク
この問題を解決するには、2つのアルゴリズムが必要です.エラストマ デュアルポインタ
広範囲に存在する少数者を救うためにエラトステネスのふるいを利用する.の小数を格納するリストを生成します. において、リストには、ラテン体を用いて小数を格納する.
エラトステネスの体を利用して、救われた少数の人を投球した.左側のインデックスは減算を繰り返します. 右インデックスは、加算を繰り返します. 2つのインデックスを移動し、nと現在の合計が同じである場合、状況の数が増加します.
2.問題リンク
1.トラブルシューティング
この問題を解決するには、2つのアルゴリズムが必要です.
1-1. エラトステネスのふるい
広範囲に存在する少数者を救うためにエラトステネスのふるいを利用する.
1-2. ダブルポインタ
エラトステネスの体を利用して、救われた少数の人を投球した.
2.ソースコード
//소수의 연속합
import java.util.*;
import java.io.*;
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());
// 에라토스테네스 체
boolean[] prime = new boolean[n + 1];
List<Integer> prime_list = new ArrayList<>();
for (int i = 2; i <= n; i++) {
if (!prime[i]) {
prime_list.add(i);
for (int j = i; j <= n; j += i) {
prime[j] = true;
}
}
}
Collections.sort(prime_list);
twoPoint(n, prime_list);
}
private static void twoPoint(int n, List<Integer> prime_list) {
int left_idx = -1, right_idx = -1;
int sum = 0, ans = 0;
while (left_idx < prime_list.size()) {
while (++right_idx < prime_list.size()) {
sum += prime_list.get(right_idx);
if (sum <= n) { // 합이 n과 동일하거나 작은 경우
if (sum == n)
ans++;
} else // 합 > n
break;
}
while (++left_idx < prime_list.size()) {
sum -= prime_list.get(left_idx);
if (sum <= n) {
if (sum == n)
ans++;
break;
}
}
}
System.out.println(ans);
}
}
Reference
この問題について(1644.少数連続和), 我々は、より多くの情報をここで見つけました https://velog.io/@jms8732/1644.-소수의-연속합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol