标签:
题目大意 : 给出一段区间 找出一段子区间 使得这段子区间的和比题里给出的定值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();
}
}
标签:
原文地址:http://www.cnblogs.com/123456YG/p/4999858.html