[伯俊]1644小数の連続和-javascript


📌 質問する


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

📌 に答える

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

let n = Number(input[0]);
// 에라토스테네스의 체
let primes = [];
let check = new Array(n + 1).fill(true);
for (let i = 2; i * i <= n; i++) {
  if (!check[i]) continue;
  for (let j = i * i; j <= n; j += i) {
    check[j] = false;
  }
}
for (let i = 2; i <= n; i++) {
  if (check[i]) primes.push(i);
}

// 투포인터 탐색
let left = (sum = cnt = 0);
for (let right = 0; right < primes.length; right++) {
  sum += primes[right];
  while (sum > n) {
    sum -= primes[left];
    left++;
  }
  if (sum === n) cnt++;
}
console.log(cnt);
✔アルゴリズム:ダブルポインタ
✔テストステロンのふるいを使用して入力値nまでの小数をprimes配列にすべて格納する
✔primes配列で、左、右をindex 0にして、ダブルポインタナビゲーションを開始します
✔rightを1に増やし、sum値をnに加算する場合は、個数を検索する必要があります.
✔sumがnより大きい場合、sumから左ポインタ値を減算し、左ポインタ1がnより小さいまで増加する
❗およびn未満の場合、for文は自動的に右ポインタを1つ追加しますので、条件文Xに入れる必要があります
✔sumがnの場合、cnt 1が増加
✔難易度:標準プラチナ3