Subsequence
原题链接:传送门
尺取模板题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <fstream>
using namespace std;
const int N = 1e5 + 9;
void solve() {
int n, s;
cin >> n >> s;
vector<int>a(n + 1);
for (int i = 0; i < n; i++) cin >> a[i];
int l = 0, r = 0, sum = 0, ans = N;
while (1) {
while (r < n && sum < s) sum += a[r++];
if (sum < s) break;
ans = min(r - l, ans);
sum -= a[l++];
}
cout << (ans >= N ? 0 : ans) << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
Sum of Consecutive Prime Numbers
原题链接:传送门
题意:一个数字能是否能用若干个连续的素数之和表示,并且想知道有多少种方法。
思路:素数筛打表+尺取
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <fstream>
using namespace std;
const int N = 10010;
int p[N], cnt;
bool st[N];
bool pan(int x) {
for (int i = 2; i * i <= x; i++)
if (x % i == 0) return false;
return true;
}
void init_prime(int x) {
for (int i = 2; i <= x; i++)
if (pan(i)) p[cnt++] = i;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
init_prime(10010);
int n;
while (cin >> n, n) {
int l = 0, r = 0;
int sum = 0, ans = 0;
while (1) {
while (p[r] <= n && sum < n) sum += p[r++];
if (sum == n) ans++;
sum -= p[l++];
if (sum < 0) break;
}
cout << ans << endl;
}
return 0;
}