POJ3061 Subsequence

简单说两句

作者:后端小知识

CSDN个人主页后端小知识

🔎GZH后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

POJ3061 Subsequence 这道题是POJ上id为3061的一道题,这道题总体来说比较简单,但是坑点也不少额,稍微不注意就WA了,好了,我们一起来看看题意吧:
我们先看下中文大致题意吧:

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

下面的描述是来自POJ官网

题目描述

A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S.

输入描述

The first line is the number of test cases. For each test case the program has to read the numbers N and S, separated by an interval, from the first line. The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file.

输出描述

For each the case the program has to print the result on separate line of the output file.if no answer, print 0.

示例1

输入

2
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5

输出

2
3

题目链接: POJ3061 Subsequence

思路:

这道题最最暴力的做法就是n2的时间复杂度,n2是会TLE(超时)的,应该进行优化,怎么优化呢,我们比较容易想到双指针算法!

我们来看看成功AC的代码吧:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int t;
int n,s;
int a[100010];

int main(){
    cin>>t;
    while(t--){
        cin>>n>>s;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++) cin>>a[i];
        int r=0;
        int su=0;
        int len=n+1;
        for(int i=1;i<=n;i++){
            while(r<=n&&su<s){
                r++;
                su+=a[r];
            }
            if(su>=s) len=min(len,r-i+1);
            su-=a[i];
        }
        if(len>n) cout<<"0\n";
        else cout<<len<<"\n";
    }
    return 0;
}

【都看到这了,点点赞点点关注呗,爱你们】😚😚

抽象工厂  引导关注

结语

谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,望各位老板点点赞,加个关注!😘😘😘

💬

作者:后端小知识

CSDN个人主页后端小知识

🔎GZH后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不正经小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值