滑动窗口
序列和
http://www.nowcoder.com/questionTerminal/46eb436eb6564a62b9f972160e1699c9
我用的是滑动窗口。
注意有一个大坑就是当整个窗口的和满足条件sum = N,但是整个窗口的长度大于100了,这时如果左边界为0,是可以将左边界往右移动一步的。
代码
#include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #include <cmath> #include <climits> using namespace std; int main () { int N, L; scanf("%d%d", &N, &L); int left = 0, right = 0, limit = N / 2, sum = 0; int start = 0, end = INT_MAX, len = INT_MAX; while (right <= limit) { sum += right; right++; while (sum > N) { sum -= left; left++; } if (sum == N) { if (len > right - left && (right - left) >= L) { start = left; end = right; len = right - left; } } } if (len > 100 && start == 0) { start += 1; len = 100; } if (len > 100 || len < L) { printf("No\n"); } else { for (int i = start; i < end - 1; i++) { printf("%d ", i); } printf("%d\n", end - 1); } return 0; }