【问题描述】
给定一个含有 n 个正整数的数组和一个正整数value,找出该数组中满足其和 s ≥ value 的长度最小的连续子数组 {nums[i], nums[i+1], ..., nums[i+r]} ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
【输入格式】
输入两行,第一行两个整数,分别表示个数n和目标数value;
第二行为n个数组元素,每个数之间用空格隔开。
【输出格式】
输出一行,一个整数,表示符合条件的值。
【输入样例 1】
6 7
2 3 1 2 4 3
【输出样例1】
2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
【输入样例 2】
3 4
1 4 4
【输出样例2】
1
【输入样例3】
8 11
1 1 1 1 1 1 1 1
【输出样例3】
0
#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
long long s[100005];
long long value,ans;
void search(int l,int r){
while(l<=r){
int mid=(l+r)/2;
bool f=false;
for(int i=1;i<=n-mid+1;i++){
long long sum=s[i+mid-1]-s[i-1];
if(sum>=value){
f=true;
}
}
if(f==true){
ans=mid;
r=mid-1;
}else{
l=mid+1;
}
}
}
int main(){
cin>>n>>value;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
if(value==1){
cout<<1;
exit(0);
}
if(s[n]<value){
cout<<0;
exit(0);
}
search(1,n);
cout<<ans;
return 0;
}