POJ - 2739 Sum of Consecutive Prime Numbers(尺取法)

题目大意:给出一个数,问这个数有多少种组成方式
组成的规则是,连续的质数和等于该数

解题思路:尺取法的基本题了
先预处理出所有的质数,然后再for一遍,维护一个区间,当区间内的值的和超过该数时,就往右缩,当区间内的值小于该数时,就往右扩

#include 
#include 
const int N = 10010;

bool prime[N];
int cnt, n;
int num[N];

void init() {
    memset(prime, 0, sizeof(prime));
    for (int i = 2; i < N / 2; i++) {
        for (int j = 2; j * i < N; j++) 
            prime[j * i] = true;
    }

    cnt = 0;
    for (int i = 2; i < N; i++)
        if (!prime[i]) num[cnt++] = i;
}

void solve() {

    int l = 0, ans = 0, Sum = 0;
    for (int i = 0; i < cnt; i++) {
        if (num[i] > n) break;
        Sum += num[i];
        if (Sum == n)  ans++;
        else if (Sum > n) {
            for (; Sum > n; l++) Sum -= num[l];
            if (Sum == n) ans++;
        }
    }
    printf("%d\n", ans);
}

int main() {
    init();
    while (scanf("%d", &n) != EOF && n) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(ACM-高效算法设计)