POJ 3061 Subsequence(尺取法)

题目链接: 传送门

Subsequence

Time Limit: 1000MS     Memory Limit: 65536K

题目描述

给定长度为n的数列整数以及整数S。求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。

思路

O(nlogn)算法

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int N,S,i;
		int ans[100005] = {0},sum[100005] = {0};
		scanf("%d%d",&N,&S);
		int res = N;
		for (i = 0;i < N;i++)
		{
			scanf("%d",&ans[i]);
			sum[i + 1] = sum[i] + ans[i];
		}
		if (sum[i] < S)
		{
			res = 0;
		}
		else
		{
			for (i = 0;sum[i] + S < sum[N];i++)
			{
				int tmp = lower_bound(sum + i,sum + N,sum[i] + S) - sum;
				res = min(res,tmp - i);
			}
		}
		printf("%d\n",res);
	}
	return 0;
} 

O(n)

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int N,S;
		int ans[100005] = {0};
		
		scanf("%d%d",&N,&S);
		for (int i = 0;i < N;i++)
		{
			scanf("%d",&ans[i]);
		}
	
		int res = N + 1;
		int sum = 0,t = 0,s = 0;
		for (;;)
		{
			while (t < N && sum < S)
			{
				sum += ans[t++];
			}
			if (sum < S)
			{
				break;
			}
			res = min(res,t - s);
			sum -= ans[s++];
		}
		
		if (res > N)
		{
			res = 0;
		}
		printf("%d\n",res);
	}
	return 0;
} 
posted @   zxzhang  阅读(119)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航