我用的是滑动窗口。
注意有一个大坑就是当整个窗口的和满足条件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;
}
京公网安备 11010502036488号