码迷,mamicode.com
首页 > 其他好文 > 详细

UVA1121

时间:2015-11-27 12:42:02      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

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

UVA1121

标签:

原文地址:http://www.cnblogs.com/123456YG/p/4999858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!