2 条题解
-
0
- 更好理解的写法
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T, n, l, r; cin >> T; while (T--) { cin >> n >> l >> r; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; int ans = 0, sum = 0; for (int i = 0, j = 0; i < n; i++) { // 当 sum < l 并且还可以往右移 sum += a[i]; while (sum < l && i + 1 < n) sum += a[++i]; // 情况一: l <= sum <= r 直接得分, i 和 j 都移到后一个位置 if (l <= sum && sum <= r) sum = 0, ans++, j = i + 1; else { // 情况二:sum >= r, 需要从左开始删除一些数 while (sum > r && j <= i) sum -= a[j++]; if (sum >= l) sum = 0, ans++, j = i + 1; else { // 情况三:不能删除一些数使得 sum >= l // 其实啥也不干, 继续游戏就好 // sum = 0, j = i + 1; } } } cout << ans << '\n'; } return 0; } -
0
- 同向双指针
#include <bits/stdc++.h> using namespace std; int solve(const vector<int>& a, int l, int r) { int n = a.size(), ans = 0, sum = 0, j = 0; for (int i = 0; i < n; i++) { // 先往右扩展, 直到 sum >= l sum += a[i]; while (sum < l && i + 1 < n) sum += a[++i]; // sum > r 时, 从左边开始删除一些数 while (sum > r && j <= i) sum -= a[j++]; if (sum >= l && sum <= r) ans++, sum = 0, j = i + 1; } return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T, n, l, r; cin >> T; while (T--) { cin >> n >> l >> r; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; cout << solve(a, l, r) << '\n'; } return 0; } /* 1 3 4 5 3 3 1 1 */ /* 1 3 4 5 3 3 4 1 */
- 1
信息
- ID
- 188
- 时间
- 100ms
- 内存
- 32MiB
- 难度
- 6
- 标签
- 递交数
- 60
- 已通过
- 19
- 上传者