题目大意 : 给出一段区间 找出一段子区间 使得这段子区间的和比题里给出的定值m要大 其中可能有许多满足改题意的子区间 找出其中最短的那个字区间
解题思路: 先分析复杂度 知道这道题要用小于O(n)的复杂度来做 即只能扫一遍 有之前的指针扫法可以判断是可行的
即设2个变量 l, r 扫一遍r , l 随着sum的变化不断动 从而min来最终得到最优解
代码如下:
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; const int MaxN = 1e5; int sum, m, n, a[MaxN + 5]; void pdo() { int l = 1, r = n, ans = 1 << 30; for(int i = 1; i <= r; i++) { sum += a[i]; while(sum >= m && l <= i) { ans = min(ans, i - l + 1); // 此处要注意对于区间长度的求解问题 注意l, r的变化 sum -= a[l]; //printf("%d\n", sum); l++; } } if(ans == (1 << 30)) printf("0\n"); // 这项输出在题干中并没有给出 要通过经验合理分析 else printf("%d\n", ans); } int main() { while(~scanf("%d %d", &n, &m)) { sum = 0; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); pdo(); } }
时间: 2024-12-21 16:06:56