UVA1121

题目大意 : 给出一段区间  找出一段子区间  使得这段子区间的和比题里给出的定值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

UVA1121的相关文章

例题1.21 子序列 UVa1121

1.题目描述:点击打开链接 2.解题思路:本题是典型的二分搜索题,二分答案后验证是否满足和大于等于S即可. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack>