题解 | #dd爱框框#
dd爱框框
https://ac.nowcoder.com/acm/problem/221681
双指针模板题。
思路:
- 其实没什么好说的,这题都讲烂了,无非是维护两个指针 l,r 来标识前后位置,维护 sum 代表其间的和,若 sum 大于等于 x 就尝试更新答案并移动左指针,若 sum 小于 x 就移动右指针(指针都只向前移动,移动时保证 sum 为 l,r 之间的和)
- 唯一的麻烦在于边界处理,建议一边想一边写,这样能更方便快速的得出结论
#include <bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long typedef pair<int, int> pii; typedef pair<int, char> pic; const int N = 10000009; const int mod = 1e9 + 7; int n, x, a[N]; int main() { cin >> n >> x; for(int i = 1; i <= n; i ++) scanf("%d", a + i); int sum = 0; int l = 1, r = 1; int ans = N, ansl = N; /// 分别记录区间长度和区间左端点 while(r <= n) { if(sum >= x) { if(r - l < ans) ans = r - l, ansl = l; sum -= a[l ++]; } else sum += a[r ++]; } cout << ansl << ' ' << ansl + ans - 1; return 0; }