help!!听取WA声一片———长度最小的子数组

这是代码

#include<bits/stdc++.h>

using namespace std;

int main(){
	long long a[300010],t,s,n;
	cin>>t;
	while(t--){
		long long sum=0;
    int minn=1e9;
    cin>>n>>s;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1,j=1;i<=n;i++){
        while(sum<s&&j<=n){         
            sum+=a[j];
            j++;                
        }
        if(sum>=s) minn=min(minn,j-i);  
        sum-=a[i];      
    }
    if(minn==1e9)cout<<"0";   
    else cout<<minn;
	}
    
    return 0;

}

题目:

G.  长度最小的子数组
Problem ID: 8091
Contest ID: 5874
必做题
Wrong Answer 60
时间:1s 空间:256M
题目描述:
给定一个含有 n 个整数的数组和一个整数 s ,找出该数组中满足其和 ≥s 的长度最小的连续子数组。

如果不存在符合条件的连续子数组,输出 0。

输入格式:
第一行包含一个整数 T,表示测试数据组数。

对于每组测试数据,

第一行包含两个整数 n, s。

接下来包含 n 个整数 ai

输出格式:
对于每组测试数据,输出一个整数表示答案。



样例1输入:
3
8 7
2 3 1 2 0 4 3 0
8 100
2 3 1 2 0 4 3 0
3 0
1 1 1
样例1输出:
2
0
1


约定与提示:
对于100%的数据,

1≤T≤3⋅105,

1≤n≤3⋅105,

0≤s≤1018,

0≤ai≤109

保证 ∑n≤3⋅105
对于样例1的第一组测试数据:子数组下标是[6,7],所以答案为 2。

按老师上课的思路写的,还是不对

在if(sum>=s)前面还要一个while,缩小已选数组的长度

2 个赞

这是一道简单的尺取(双指针)

2 个赞